从HttpClient4升级到HttpClient5,坑坑坑

文章讲述了在将HttpClient从4.x版本升级到5.x版本过程中遇到的主要API变动,包括Socket超时设置、默认主机配置、HttpRequestBase的改变以及某些类的消失。作者提供了针对这些问题的解决办法,如使用SocketConfig和HttpRoutePlanner的新接口,以及寻找HttpUriRequestBase的替代方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我最近要把HttpClient4升级到HttpClient5,在升级的过程中,发现许多 API 已删除了,并且也没有找到非常合适的文档可用于全面了解升级方案。

目前网上的博客或者帖子大部分都是与httpcomponents4.x 相关的回答,但这些 API 在HttpClient5里,已经被删除或者修改了。

我把我目前用到的或者查询到的备选方案先写出来。如果有高手,请指正这些中的问题。

1.设置Socket套接字超时

HttpClient5删除了RequestConfig.custom().setSocketTimeout(socketTimeout).build()的API。
经过研究,发现有单独的 SocketConfig 类,需要设置ConnectionManager

 SocketConfig socketConfig=SocketConfig.custom()
                                 .setSoTimeout(Timeout.ofMilliseconds(10000))
                                 .build();

 BasicHttpClientConnectionManager connMgr=new BasicHttpClientConnectionManager(registry);
 connMgr.setSocketConfig(socketConfig);

 CloseableHttpClient httpclient = HttpClients.custom()
         .setConnectionManager(connMgr)
         .build();

2.设置默认主机

按照How does one set Default HttpHost Target in Apache HttpClient 4.3+? 这篇文章,发现可以覆盖DefaultRoutePlanner的determineRoute方法。但在 HttpClient5中却没有办法这么整,因为HttpClient5把这个方法声明为了final。所以我这样子搞:

HttpHost targetHost = new HttpHost(myHost,myPort);
HttpRoutePlanner planner=new HttpRoutePlanner() {

@Override
public HttpRoute determineRoute(HttpHost var1, HttpContext var2) throws HttpException {
             HttpRoute route=new HttpRoute(targetHost);//default for all requests
             return route;
         }
};
CloseableHttpClient client=HttpClients.custom()
             .setConnectionManager(mgr)
             .setRoutePlanner(planner)
             .build();

3.HttpRequestBase替换为HttpUriRequestBase

在HttpClient4的 HttpRequestBase 中,我们可以调用 getRequestLine()方法来打印请求的详细信息,如下所示:

POST https://url HTTPS/1.1

但是在HttpClient5的HttpUriRequestBase中国,删除了getRequestLine()API,所以我这样使用:

httpReq.getMethod()+" "+httpReq.getUri()

4.没有单独的httpasyncclient、 httpcore-nio库

经过研究,发现以前httpclient4的很多类,从httpclient5开始都没有了。比如以下所有类都被干掉了

SSLIOSessionStrategy 
NoopIOSessionStrategy
PoolingNHttpClientConnectionManager
DefaultConnectingIOReactor
ConnectingIOReactor
IOReactorException

目前还没找到这些类的替代方案。

以后找到了,会持续更新

### httpClient5 中设置超时时间的方法 在 `httpClient5` 版本中,配置请求超时的方式有所变化。不再直接使用 `setSocketTimeout()` 方法来设定套接字超时时间。取而代之的是利用 `HttpRequestConfig.Builder` 来构建更灵活的请求配置对象。 对于 HTTP 客户端实例来说,可以通过创建并应用自定义的 `HttpClientConfiguration` 实现全局范围内的默认参数设置,包括连接建立超时、响应数据读取等待的最大时限等重要属性: ```java // 创建一个带有特定超时配置的 HttpClientBuilder 并初始化客户端 ClassicRequestDirector director = new ClassicRequestDirector( new DefaultConnectionReuseStrategy(), new StandardResponseParserFactory<>(new BasicLineFormatter.INSTANCE, new StrictContentLengthStrategy()), null); int timeOut = 5000; // 设置超时时间为5秒 boolean isRedirect = true; final HttpRequestConfig config = HttpRequestConfig.custom() .setConnectTimeout(timeOut) .setResponseTimeout(timeOut) // 这里代替了旧版本中的 setSocketTimeout .build(); CloseableHttpAsyncClient client = HttpAsyncClients.custom() .setDefaultRequestConfig(config) .build(); ``` 上述代码片段展示了如何在一个异步 HTTP 客户端上指定连接和响应处理的时间限制[^1]。值得注意的是,在此上下文中 `.setResponseTimeout()` 可视为原生 `setSocketTimeout()` 的功能继承者,用于控制服务器返回内容到客户端之间的最大允许延迟。 当涉及到具体的请求执行时,还可以针对单个请求进一步微调这些选项而不影响其他请求的行为模式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值