Angular SSR 应用里的 HTTP timeout 研究

举报
汪子熙 发表于 2025/06/02 13:30:00 2025/06/02
【摘要】 源代码:export const defaultBackendHttpTimeoutConfig: OccConfig = { backend: { timeout: { server: 20_000, }, },};通过 HTTP interceptor 来完成:@NgModule({ providers: [ { provide: HTTP_I...

源代码:

export const defaultBackendHttpTimeoutConfig: OccConfig = {
  backend: {
    timeout: {
      server: 20_000,
    },
  },
};

通过 HTTP interceptor 来完成:

@NgModule({
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useExisting: S4HttpTimeoutInterceptor,
      multi: true,
    },
    DefaultConfigInjected(defaultBackendHttpTimeoutConfig),
  ],
})
export class HttpTimeoutModule {}

使用 HTTPInterceptor 可以实现 HTTP 请求超时机制的控制。

HttpInterceptor 是 Angular 框架中用于拦截和处理 HTTP 请求和响应的机制。它的存在是为了增强应用的 HTTP 客户端,即 HttpClient,使得我们可以在数据的请求和传输的生命周期中进行操作,进而实现各种目的,例如修改请求头、处理错误、统一处理身份认证、记录日志等。简单来说,HttpInterceptor 允许开发者在 HTTP 请求和响应进入应用前做某种处理,或者在请求从服务器到达客户端之前做某种操作。它的主要作用是在后台为每一个 HTTP 请求提供某种形式的拦截和管理逻辑,保证应用行为的一致性和扩展性。

HttpInterceptor 在 Angular 的依赖注入系统中被设计为可插拔的、可组合的方式,通过创建并注入多个拦截器,开发者可以将不同的业务逻辑分离到不同的拦截器中。这样不仅提高了代码的复用性和可维护性,而且让代码更加干净和易读。

HttpInterceptor 的工作方式基于 Angular 的 HttpClient 服务。每当 HttpClient 发起一个 HTTP 请求时,所有的拦截器会按照注册的顺序依次执行,处理每个请求并继续向下传递。拦截器是链式调用的,这意味着每个拦截器都会获得当前请求的快照并对其进行操作,然后将其传递给下一个拦截器。每个拦截器都有权对请求和响应进行修改,但它不能中断整个拦截器链。

每个拦截器都必须实现 HttpInterceptor 接口,该接口只有一个方法 intercept(req: HttpRequest<any>, next: HttpHandler)

intercept 方法接收两个参数:

  • req: HttpRequest<any>:表示即将发送的 HTTP 请求。

  • next: HttpHandler:表示 HTTP 请求链中下一个处理程序。

HttpHandler 是一个具有 handle 方法的对象,它负责将修改过的 HttpRequest 实例传递给下一个处理程序,最终到达服务器端。

在拦截器中,开发者可以选择返回修改后的 HttpRequest 或是 HttpResponse,或者是 Observable 类型的其他内容,这使得拦截器的功能非常灵活。Angular 内部采用了 RxJS(响应式扩展库)来管理 HTTP 请求的流,这让我们可以用强大的操作符来操作数据流,实现异步处理等功能。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。