Angular:如何扩展 HttpClient?

Posted

技术标签:

【中文标题】Angular:如何扩展 HttpClient?【英文标题】:Angular : How to extend HttpClient? 【发布时间】:2017-08-27 15:55:50 【问题描述】:

我在documentation 中没有找到如何扩展 HttpClient 或如何为我的一些 HTTP 请求指定不同的拦截器。在文档中,他们解释了如何在 HTTP_INTERCEPTORS 中设置拦截器,但每个 HTTP 请求都会被拦截。

我需要自定义 HttpClient 实现来设置具体的标头、端点或响应拦截器(我不想使用 Restangular,我更喜欢使用内置的 angular HttpClient 实现)。

我有一个带有特定端点和特定标头的 oAuth API 来设置我的 api-key。 我还有我的“资源”API,它需要特定的标头(Authorization: Bearer ... 和 API-KEY)和特定的响应拦截器来捕获所有 HTTP 401 响应。 也许,我需要在没有任何拦截器的情况下调用一些外部 API

我知道使用 Restangular 可以做到这一点,但我更喜欢使用 HttpClient。怎么可能?

我找到了this article,但是,这是针对Http 而不是针对新的HttpClient Angular 实现。

【问题讨论】:

【参考方案1】:

我不会扩展 HttpClient,而是采用以下三种方法之一:

    让您的每个拦截器检查请求的 URL,然后根据 URL 进行操作,或者直接调用 next.handle(req) 而不执行任何其他操作

    编写一个委托拦截器,根据您的要求决定委托给哪些其他拦截器。

    只需编写一个大的拦截器,它会根据 URL / 任何你需要的东西来决定做什么。

我的直觉是选择#1

【讨论】:

感谢您的评论。我认为这种方法不尊重关注点分离(第一个除外?!)。但是如果我使用拦截器设置 api 端点,我将无法检查 URL ?! 我并不是建议在拦截器中设置端点,只是设置特定端点所需的任何标头。我认为您的服务应该负责了解端点 url。 我的每个自定义 HttpClient 实现都有自己的常量 URL 端点,我不想使用类似 getURLEndpoint() 的方法。 就像@GreyBeardedGeek 所说将硬编码的URI 端点设置到您的提供程序中不是一个好习惯。但是如果你不想改变,你可以很容易地使用方法#1或#2。 我不是建议在提供程序中设置(硬编码)端点...

以上是关于Angular:如何扩展 HttpClient?的主要内容,如果未能解决你的问题,请参考以下文章

Angular 4.3.3 HttpClient:如何从响应的标头中获取值?

Angular httpClient https调用错误

如何在 Angular 的 HttpClient 中使用 reportProgress? [复制]

如何在 Typescript 类中创建 Angular 5 HttpClient 实例

如何在测试中模拟 Angular 4.3 httpClient 的错误响应

如何在 Angular 6 中使用 HttpClient 禁用缓存