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

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

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


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


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


image.png


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


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


image.png


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


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


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


image.png


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


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


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


image.png


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


image.png


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


 

/**
   * 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 页面:



image.png

相关文章
|
缓存 前端开发 JavaScript
基于 Spartacus 的 Angular Storefront 性能优化建议
基于 Spartacus 的 Angular Storefront 性能优化建议
|
2月前
|
Web App开发 监控 UED
如何解决Angular中的Error: HTTP request failed, call timeout问题
在Angular应用中,遇到HTTP请求超时错误`Error: HTTP request failed, call timeout`时,可通过多种途径解决。首先,可增加请求超时时间,Angular默认无超时限制,设置合理的超时时间如5秒有助于避免长时间等待无响应。其次,检查服务器响应时间,利用开发者工具监控网络请求,优化服务器端代码或调整超时值。最后,确认网络连接稳定性,使用`navigator.onLine`检测网络状态,并在不同网络环境中测试。这些策略共同作用,能够有效提升应用的稳定性和用户体验。
106 1
|
5月前
|
JavaScript 前端开发
Angular.js 应用里如何发送 HTTP 请求
Angular.js 应用里如何发送 HTTP 请求
|
前端开发 JavaScript vr&ar
一款开源的 Angular Storefront 应用介绍,代号 Spartacus 诞生的历史背景
一款开源的 Angular Storefront 应用介绍,代号 Spartacus 诞生的历史背景
|
12月前
|
缓存 前端开发 JavaScript
为什么使用 CDN 需要 Angular 应用正确返回 HTTP 200 和 404 状态码
为什么使用 CDN 需要 Angular 应用正确返回 HTTP 200 和 404 状态码
|
12月前
|
数据采集 搜索推荐 索引
Angular 服务器端渲染应用返回 HTTP 404 和 200 状态码对 SEO 的影响
Angular 服务器端渲染应用返回 HTTP 404 和 200 状态码对 SEO 的影响
|
缓存 JavaScript 中间件
使用 Angular HTTP_INTERCEPTOR 拦截器来记录超时请求的一些思考
使用 Angular HTTP_INTERCEPTOR 拦截器来记录超时请求的一些思考
|
5月前
|
缓存 前端开发 JavaScript
Angular Service Worker 在 PWA 应用 HTTP 交互中扮演的角色
Angular Service Worker 在 PWA 应用 HTTP 交互中扮演的角色
|
5月前
|
缓存 JavaScript 中间件
如何在 Angular 应用中发起 HTTP 302 redirect
如何在 Angular 应用中发起 HTTP 302 redirect
|
5月前
|
JavaScript
Angular Input 注解在 Spartacus 项目开发中的实际应用场景一例
Angular Input 注解在 Spartacus 项目开发中的实际应用场景一例