0Pricing
Angular Academy · 课时

函数式拦截器

使用函数式拦截器拦截请求

函数式拦截器 是 CoddyKit 上的免费 Angular Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Angular Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Angular Academy 课程共包含 4 节课。

什么是拦截器

HTTP 拦截器位于您的应用与网络之间。每个请求和响应都会经过它,因此您可以在一个集中位置添加请求头、记录日志、转换数据、重试请求或处理错误。

HttpInterceptorFn

现代 Angular 使用函数式拦截器:HttpInterceptorFn 接收请求和一个 next 处理程序,并返回 HTTP 事件的可观察对象。

import { HttpInterceptorFn } from '@angular/common/http';

export const loggingInterceptor: HttpInterceptorFn = (req, next) => {
  console.log('request to', req.url);
  return next(req);
};

使用 withInterceptors 注册

在应用配置中通过 provideHttpClient(withInterceptors([...])) 提供拦截器。

import { provideHttpClient, withInterceptors } from '@angular/common/http';

export const appConfig = {
  providers: [
    provideHttpClient(withInterceptors([loggingInterceptor]))
  ]
};

next 处理程序

调用 next(req) 将请求传递给链中的下一个处理程序。您返回的内容会成为请求流的一部分;不调用 next 就意味着请求永远不会发出。

请求不可变

HttpRequest 是不可变的。要修改它,必须使用修改内容调用 clone(),然后将克隆结果传递给 next。

export const interceptor: HttpInterceptorFn = (req, next) => {
  const cloned = req.clone({ setHeaders: { 'X-App': 'demo' } });
  return next(cloned);
};

链接多个拦截器

拦截器按照列出的顺序运行。每个拦截器都会包装下一个拦截器,因此数组形成一个管道:第一个拦截器最先看到请求,最后看到响应。

withInterceptors([authInterceptor, loggingInterceptor, errorInterceptor])
// auth runs first on the way out

在拦截器中使用 inject()

函数式拦截器会在注入上下文中运行,因此您可以直接使用 inject() 获取服务。

import { inject } from '@angular/core';

export const authInterceptor: HttpInterceptorFn = (req, next) => {
  const token = inject(AuthService).token();
  return next(req); // use token to modify req
};

检查响应

接入返回的流以观察响应,例如进行计时或日志记录。

import { tap } from 'rxjs';

export const timingInterceptor: HttpInterceptorFn = (req, next) => {
  const start = Date.now();
  return next(req).pipe(
    tap(() => console.log(req.url, Date.now() - start, 'ms'))
  );
};

条件式拦截

您可以根据请求 URL 或方法进行分支,以选择性地应用逻辑。

export const apiOnly: HttpInterceptorFn = (req, next) => {
  if (!req.url.startsWith('/api')) return next(req);
  const cloned = req.clone({ setHeaders: { 'X-Api': '1' } });
  return next(cloned);
};

函数式拦截器与类拦截器

函数式拦截器取代了旧的基于类的 HttpInterceptor。它们更简单、可进行树摇优化、易于测试,并且无需 DI 令牌即可注册。

基于 DI 的拦截器互操作

如果必须使用旧式类拦截器,withInterceptorsFromDi() 可以连接它们。对于新代码,建议优先使用函数式拦截器。

provideHttpClient(
  withInterceptors([authInterceptor]),
  withInterceptorsFromDi()
)

快速检查

测试您对函数式拦截器的理解。

回顾:函数式拦截器

拦截器集中处理横切性的 HTTP 逻辑。

  • HttpInterceptorFn: (req, next) => Observable。
  • 使用 withInterceptors([...]) 注册。
  • 克隆请求以修改它们;调用 next 继续传递。
  • 使用 inject() 获取服务。

下一步:添加身份验证请求头。

常见问题解答

「函数式拦截器」课时是免费的吗?

是的 — 「函数式拦截器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Angular Academy 课程的其余内容,请升级到 CoddyKit PRO。 Angular Academy 课程共包含 4 节课。

「函数式拦截器」这节课中我会学到什么?

使用函数式拦截器拦截请求 你通过在浏览器中直接运行的动手代码来练习 Angular Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Angular Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Angular Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「函数式拦截器」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Angular Academy 课中编写并运行代码吗?

能。每节 Angular Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 函数式拦截器
  2. 添加身份验证标头
  3. 全局处理错误
  4. 重试与加载指示器
← 返回 Angular Academy