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 中使用 reportProgress? [复制]
如何在 Typescript 类中创建 Angular 5 HttpClient 实例