首页 > 其他分享 >关于 SAP Spartacus Angular HTTP Interceptor 的拦截顺序

关于 SAP Spartacus Angular HTTP Interceptor 的拦截顺序

时间:2022-10-15 11:44:44浏览次数:73  
标签:拦截器 HTTP Spartacus Interceptor SAP checkout

Angular 按照开发人员提供的 HTTP Interceptors 的顺序来依次 调用这些拦截器。

例如,考虑这种例子,开发人员希望处理 HTTP 请求的身份验证,并在将它们发送到服务器之前记录它们。要完成这个场景,可以按顺序先提供 AuthInterceptor,然后再提供 LoggingInterceptor. Angular 应用发送出的请求,将从 AuthInterceptor 流向 LoggingInterceptor。相应的,这些请求的响应将反向流动,即从 LoggingInterceptor 返回到 AuthInterceptor.

以下是该过程的图形化表示:

流程中的最后一个拦截器始终是处理与服务器通信的 HttpBackend.

SAP Spartacus 开发中为令牌 HTTP_INTERCEPTORS 提供的绝大多数 Interceptor,都定义在 barrel 文件即 index.ts 内:

这些 Interceptor 彼此之间在业务上并没有依赖关系,所以没有严格的先后顺序定义要求。

大多数 HttpClient 方法返回 HttpResponse<any> 的 observables。 HttpResponse 类本身实际上是一个事件,其类型为 HttpEventType.Response. 但是,单个 HTTP 请求可以生成多个其他类型的事件,包括上传和下载进度事件。 HttpInterceptor.intercept()HttpHandler.handle() 方法返回 HttpEvent<any> 的 observables.

下面是 SAP Spartacus 一个具体的 Interceptor 例子:

许多拦截器只关心传出请求并从 next.handle() 返回事件流而不修改它。 然而,一些拦截器需要检查和修改来自 next.handle() 的响应; 这些操作需要识别到流中的所有这些事件。

上图是 Spartacus Cart Checkout 场景使用 Interceptor 进行错误处理的一个例子。

首先从 rxjs/operators 里导入 Rxjs 执行错误处理的操作符 catchError

当 HTTP 交互出现错误时,传入 catchError 操作符的箭头函数触发,如果触发时的实例变量 response 的类型为 HttpErrorResponse,那么继续判断当前的路由路径,是否包含了 checkout 片段:

这个判断通过下列函数执行:

  /**
   * Returns true if the parameter semantic route is part of "checkout"
   * Checkout semantic routes:
   * checkout
   * checkoutPaymentType
   * CheckoutShippingAddress
   * checkoutDeliveryMode
   * checkoutPaymentDetails
   * checkoutReviewOrder
   * checkoutLogin
   * @param semanticRoute
   */
  protected isUserInCheckoutRoute(semanticRoute?: string): boolean {
    return semanticRoute?.toLowerCase().startsWith('checkout') ?? false;
  }

如果上述函数返回 true,则通过 this.routingService.go, 重定向到 cart 页面:

标签:拦截器,HTTP,Spartacus,Interceptor,SAP,checkout
From: https://www.cnblogs.com/sap-jerry/p/16793807.html

相关文章

  • SAP Spartacus HTTP Interceptor 的 provisioning 逻辑
    假import{Injectable}from'@angular/core';import{HttpEvent,HttpInterceptor,HttpHandler,HttpRequest}from'@angular/common/http';import{Observable......
  • 关于 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协议,大家都会想起它是......