gpt4 book ai didi

angular - 为不同的服务提供不同的 HTTP_INTERCEPTORS

转载 作者:行者123 更新时间:2023-12-03 23:56:18 26 4
gpt4 key购买 nike

我有一个非常实用的可用问题,它可能有一些花哨的 Angular Dependency Injection 解决方案。

基本上:

我有 拦截器 A 提供用于与 通信的 Auth header 服务A .

我有 拦截器 B 提供用于与 通信的 Auth header 服务B .

如何获取 的每个实例服务A 拥有拦截器链 拦截器 A ?我如何保证服务 B 的相反?

这两个服务都在整个应用程序中全局使用,所以我认为我不能只在使用服务 B/A 的模块中定义新的 HTTP_INTERCEPTOR 注入(inject) token 。

谢谢!

最佳答案

考虑到这两个服务都在根注入(inject)器上注册,唯一的方法是创建一个类似于 HttpClientModule 的新模块。但有新的 DI token - HttpClientB而不是 HttpClientHTTP_INTERCEPTORS_B而不是 HTTP_INTERCEPTORS .这需要从 common/http/src 中提取几个内部结构。因为它们没有被导出,例如interceptingHandler .

这样,服务 B 就有可能在 HTTP_INTERCEPTORS 中拥有自己的注入(inject)器。并将 HTTP 客户端注入(inject)为 HttpClientB .

一种更简单的方法是拥有一个能够根据输入在实现之间切换的拦截器。如图here ,在请求期间与拦截器交互的唯一方法是通过请求参数或 header 传递数据。

因此服务 A 可以执行以下请求:

http.get(..., { headers: new HttpHeaders({ useAuth: 'A' }) });

拦截器接收到 header 并根据它做出决定:
  intercept(req, next) {
if (req.headers.get('useAuth') === 'A') ...
else if (req.headers.get('useAuth') === 'B') ...
else ...

req.headers = req.headers.delete('useAuth'));
}

如果拦截器 A 和 B 仅特定于服务 A 和 B 而不是应用程序的其余部分,则根本不应该使用拦截器。相反,这应该直接在服务 A 和 B 中完成。

关于angular - 为不同的服务提供不同的 HTTP_INTERCEPTORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46355038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com