使用自定义DelegatingHandler编写更整洁的Typed HttpClient
简介
我写了很多HttpClient,包括类型化的客户端。自从我发现Refit以来,我只使用了那一个,所以我只编写了很少的代码!但是我想到了你!你们中的某些人不一定会使用Refit,因此,我将为您提供一些技巧,以使用HttpClient消息处理程序(尤其是DelegatingHandlers)编写具有最大可重用性的类型化HttpClient。
编写类型化的HttpClient来转发JWT并记录错误
这是要清理的键入的HttpClient:
1 | using DemoRefit.Models; |
这里有许多事情需要清理,因为它们在您将在同一应用程序中编写的每个客户端中可能都是多余的:
- 从HttpContext读取访问令牌
- 令牌为空时,管理访问令牌
- 将访问令牌附加到HttpClient进行委派
- 从HttpContext读取CorrelationId
- 将CorrelationId附加到HttpClient进行委托
- 使用EnsureSuccessStatusCode()验证Http查询是否成功
编写自定义的DelegatingHandler来处理冗余代码
1 | using Microsoft.AspNetCore.Authentication; |
如您所见,现在它封装了用于同一应用程序中每个HttpClient的冗余逻辑 。
现在,清理后的HttpClient如下所示:
1 | using DemoRefit.Models; |
好多了不是吗?🙂
最后,让我们将DelegatingHandler附加到Startup.cs中的HttpClient:
1 | using DemoRefit.Handlers; |
使用Refit
如果您正在使用Refit,则绝对可以重用该DelegatingHandler!
例:
1 | using DemoRefit.Handlers; |
轮子介绍:
Refit是一个深受Square的 Retrofit 库启发的库,目前在github上共有star 4000枚,通过这个框架,可以把你的REST API变成了一个活的接口:
1 | public interface IGitHubApi |
RestService类生成一个IGitHubApi的实现,它使用HttpClient进行调用:
1 | var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com"); |