首页 > 其他分享 >SAP Spartacus HTTP Interceptor 的 provisioning 逻辑

SAP Spartacus HTTP Interceptor 的 provisioning 逻辑

时间:2022-10-15 11:44:20浏览次数:42  
标签:拦截器 HTTP Spartacus INTERCEPTORS NoopInterceptor provisioning import Class2

假import { Injectable } from '@angular/core';
import {
HttpEvent, HttpInterceptor, HttpHandler, HttpRequest
} from '@angular/common/http';

import { Observable } from 'rxjs';

/** Pass untouched request through to the next request handler. */
@Injectable()
export class NoopInterceptor implements HttpInterceptor {

intercept(req: HttpRequest, next: HttpHandler):
Observable<HttpEvent> {
return next.handle(req);
}
}


这个 NoopInterceptor 是由 Angular 的依赖注入 (DI) 系统管理的服务。 与其他服务一样,开发人员必须先提供拦截器类(Interceptor Class),然后应用才能使用它。

由于拦截器是 HttpClient 服务的可选依赖项(`optional dependencies`),因此必须在提供 HttpClient 的同一注入器或注入器的父级中提供它们。 DI 创建 HttpClient 后提供的拦截器将被忽略。

如果应用程序在应用程序的根注入器中提供 HttpClient,作为在 AppModule 中导入 HttpClientModule 的副作用,那么也应该在 AppModule 中提供拦截器。

从 `@angular/common/http` 导入 HTTP_INTERCEPTORS 注入令牌后,按照下列形式为 NoopInterceptor 提供 provider.

```typescript
{ provide: HTTP_INTERCEPTORS, useClass: NoopInterceptor, multi: true },

注意上面代码的 multi: true 选项。 这个设置告诉 Angular, HTTP_INTERCEPTORS 是一个用于注入一组值,而不是注入单个值多提供者的令牌。

考虑创建一个 barrel index 文件,将所有拦截器提供者的代码,收集到一个 httpInterceptorProviders 数组中。

这个 barrel index 文件的文件名为 index.ts, 内容如下:

/* "Barrel" of Http Interceptors */
import { HTTP_INTERCEPTORS } from '@angular/common/http';

import { NoopInterceptor } from './noop-interceptor';

/** Http interceptor providers in outside-in order */
export const httpInterceptorProviders = [
  { provide: HTTP_INTERCEPTORS, useClass: NoopInterceptor, multi: true },
];

然后我们在 App Module 里直接从 index.ts 里导入 httpInterceptorProviders 数组即可:

providers: [
  httpInterceptorProviders
],

下面我们看一看 Spartacus 的 SiteContextInterceptor 是如何被导入 NgModule 的。

发现它被导入一个名为 SiteContextOcc 的 module 之中。

在这个 module 里,我们使用了 useExisting 而非 useClass

useExisting 相当于 provider alias,即别名。

{provide: Class2, useExisting: Class2}

上面的代码并不会导致 Angular DI 框架主动为 Class2 创建实例。运行时如果构造函数请求 Class2 的实例,Angular DI 会为 key 为 Class2 的依赖,寻找另一个 provider,并从这个 Class2 提供者中取出注入实例。 开发人员可以把 useExisting 看成对另一个提供者或别名的引用。

标签:拦截器,HTTP,Spartacus,INTERCEPTORS,NoopInterceptor,provisioning,import,Class2
From: https://www.cnblogs.com/sap-jerry/p/16793813.html

相关文章

  • 关于 Angular HTTP Interceptor 中 Request 和 Response 的 immutable 特性
    尽管拦截器能够修改请求和响应,但HttpRequest和HttpResponse实例属性为readonly,这意味着其具有immutability特性。这种特性是Angular框架有意为之的设计:应用程序......
  • JavaWeb学习4:Http
    1、什么是http超文本传输协议(HyperTextTransferProtocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。2、两个时代HTTP/1.0客户端可以与web服务器连接后,只......
  • Python Flask HTTP请求
    GET请求@app.route('/get',methods=["GET"])defget_():#返回字符串return'这是get请求' POST请求@app.route('/post',methods=["POST"])defpost......
  • javascript获取当前是http还是https
    我们经常需要获取网页的url,此时就会用到如下:document.location.protocol//判断是https:还是http:document.location.hostname//获取是localhost还是192.168.100.......
  • HTTPS的WEB SERVICE,数据量过大,客户要求压缩数据传输
    群里有人问:HTTPS的WEBSERVICE,数据量过大,客户要求压缩数据传输。然后看到侠之大者张老哥回复:sicf找到对应的服务选 YES然后再测试的时候发现记录一下。谢谢侠之大者提供......
  • Wireshark Lab: HTTP v7.0
    0.实验文件地址http://www-net.cs.umass.edu/wireshark-labs/Wireshark_HTTP_v7.0.pdf方法字段可以取不同的值:GET、POST、HEAD、PUT和DELETE。GET:请求服务器发送某个......
  • windows server2012服务器下PHPstudy配置ssl证书(https配置)
    准备: 阿里云云服务器阿里云购买的域名(已备案、已解析phpstudy:php7.1.13nts+Apachessl证书申请(我用的是阿里云上申请的证书,好像是免费用一年吧)步骤: 申请证书(这个很多方式,......
  • 调用HTTPS接口
    步骤1:打开浏览器-管理证书-导出证书到本地(常用方法,有些纯接口项目需要拿到证书和私钥)步骤2:在DOS窗口里,执行下面的语句把导出的.cer文件生成jmeter要求的.store文件(注我的......
  • Python爬虫之http协议复习
    http协议复习知识点掌握http以及https的概念和默认端口掌握爬虫关注的请求头和响应头了解常见的响应状态码理解浏览器和爬虫爬取的区别一提起http协议,大家都会想起它是......
  • HTTP1.0/HTTP1.1/HTTP2.0区别
    转载链接:https://vue3js.cn/interview/http/1.0_1.1_2.0.html#%E4%B8%80%E3%80%81http1-0一、HTTP1.0HTTP协议的第二个版本,第一个在通讯中指定版本号的HTTP协议版......