可以为 HttpClient 提供多个 HTTP 消息处理程序吗?

Posted

技术标签:

【中文标题】可以为 HttpClient 提供多个 HTTP 消息处理程序吗?【英文标题】:Can you have more than one HTTP Message Handler for HttpClient? 【发布时间】:2016-08-02 10:34:22 【问题描述】:

我需要查询发送可以加密和/或压缩和/或 Base64 编码的响应的 Web API,我想将其实现为HttpMessageHandlers 链,非常类似于@987654321 中所述@,虽然是用于 Web API。

HttpClient 的构造函数采用HttpMessageHandler,所以这是一个开始。我是否必须自己想出一个链接多个处理程序的解决方案,或者是否有更好的选择?

【问题讨论】:

【参考方案1】:

链接HttpMessageHandlers 的最简单方法是从DelegatingHandler 继承,它在其构造函数中采用内部HttpMessageHandler,并在其基础SendAsync 实现中调用它。

public class MyHandler1 : DelegatingHandler

    protected async override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, 
        CancellationToken cancellationToken)
    
        // do something before the inner handler runs (modify the request?)

        var response =  await base.SendAsync(request, cancellationToken);

        // do something after the inner handler runs (modify the repsonse?)

        return response;
    

拥有多个这些,当你构造HttpClient时,你可以按照你想要的任何顺序将它们链接在一起:

var client = new HttpClient(
    new MyHandler1(
        new MyHandler2(
            new MyHandler3(...))));

【讨论】:

以上是关于可以为 HttpClient 提供多个 HTTP 消息处理程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

jmeter http请求中的httpclient4和java有啥区别

基于httpclient与jsoup的抓取当当图书页面数据简单Demo

HttpClient和HttpURLConnection的区别

你能用.Net Core HttpClient实现Http/2多路复用吗?

http 连接失败重连机制

HttpClientFastJson将json转换为JavaBean