如何在 Angular 中使用 HttpInterceptor 拦截 HTTP 请求

阅读时长 6 分钟读完

在前端开发中,我们经常会向服务器请求获取数据或提交数据,这些请求通过 HTTP 协议进行通信。在一些情况下,我们可能需要对这些请求做一些额外的处理,例如添加一些头信息、检查用户的登录状态等等。针对这样的需求,Angular 提供了一个非常有用的特性:HttpInterceptor。本篇文章将介绍如何在 Angular 中使用 HttpInterceptor 拦截 HTTP 请求,并对其进行处理。

什么是 HttpInterceptor?

HttpInterceptor 是一个 Angular 的基本特性,它允许我们在一个 HTTP 请求发送之前或之后,对请求进行一些处理操作。这些操作可能包括:

  • 添加一些通用的头信息;
  • 将请求转换成另一种格式;
  • 检查用户的登录状态;
  • 将错误信息转换成用户友好的提示信息;
  • 缓存请求结果等等。

通过使用 HttpInterceptor,我们可以实现更加灵活和可复用的代码结构,避免在多处重复编写相同的请求处理逻辑。

如何定义一个 HttpInterceptor?

在 Angular 中,我们需要通过实现 HttpInterceptor 接口,来定义一个拦截器。这个接口只有一个方法:

在这个方法中,我们可以对 req 参数进行修改或检查,并通过 next.handle() 方法将请求传递给下一个拦截器或最终的 HTTP 处理器。

下面是一个简单的例子,演示了如何添加一个头信息:

-- -------------------- ---- -------
------ - ---------- - ---- ----------------
------ -
  ------------
  ------------
  ----------
  ----------------
- ---- -----------------------
------ - ---------- - ---- -------

-------------
------ ----- -------------------- ---------- --------------- -
  ----------
    ---- -----------------
    ----- -----------
  -- -------------------------- -
    ----- ----------- - -----------
      ----------- - --------------------- ------------------------ --
    ---
    ------ -------------------------
  -
-

在这个例子中,我们定义了一个 AddHeaderInterceptor 类,并实现了 HttpInterceptor 接口。在 intercept() 方法中,我们通过调用 req.clone() 方法,基于原始的请求对象生成了一个修改后的请求对象,添加了一个自定义的头信息。然后,我们调用了 next.handle(modifiedReq) 方法,将修改后的请求传递给下一个拦截器或最终的 HTTP 处理器。这里需要注意的是,在调用 next.handle() 方法后,我们得到的是一个 Observable<HttpEvent<any>> 对象,因此需要返回这个对象作为 intercept() 方法的返回值。

如何使用 HttpInterceptor?

要使用 HttpInterceptor,我们需要将它注册到 Angular 的 DI(依赖注入)容器中,并在 HttpClient 的配置中指定。

首先,我们需要在相应的模块(例如 app.module.ts)中,将拦截器声明为一个 provider

-- -------------------- ---- -------
------ - -------- - ---- ----------------
------ - ------------- - ---- ----------------------------
------ - ----------------- ----------------- - ---- -----------------------
------ - -------------------- - ---- ---------------------------

-----------
  -------- --------------- ------------------
  ---------- -
    -
      -------- ------------------
      --------- ---------------------
      ------ -----
    --
  --
  ---------- ---------------
--
------ ----- --------- --

在这里,我们将 AddHeaderInterceptor 类声明为一个 provider,并将它指定为 HTTP 拦截器之一。这里的 multi: true 表示当前这个 provide 可以有多个实例,因为拦截器总是以一定的顺序依次执行。

然后,在我们发送 HTTP 请求时,HttpClient 将会自动触发所有已注册的拦截器。例如:

-- -------------------- ---- -------
------ - ---------- ------ - ---- ----------------
------ - ---------- - ---- -----------------------

------------
  --------- -----------
  --------- ---
--
------ ----- ------------ ---------- ------ -
  ------------------- ----- ----------- --

  ---------- -
    -----------------------------------------------------------------------
      ----- ------ -- ------------------
      ------ ----- -- -------------------
      --------- -- -- ------------------------
    ---
  -
-

在这个例子中,我们在组件的 ngOnInit() 方法中发送了一个 HTTP 请求,获取了一个 JSON 数据源。在这个过程中,由于我们已经注册了一个 AddHeaderInterceptor 拦截器,因此在请求被发送之前,会先将头信息添加到请求中。如果你打开浏览器的开发者工具,在“Network”面板中就可以看到这个请求带有了一个名为 X-My-Custom-Header 的自定义头信息:

总结

HttpInterceptor 是 Angular 中非常有用的一个特性,它可以为我们在 HTTP 通信中添加更加灵活的处理逻辑。我们可以实现许多不同的拦截器,例如添加头信息、检查登录状态、处理错误信息等等。在本篇文章中,我们介绍了如何定义和使用一个 HttpInterceptor 拦截器,并提供了一个简单的例子。希望本文对您有所帮助,欢迎提出任何问题和建议。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e48771f6b2d6eab3ffd85b

纠错
反馈