从HttpClient4升级到HttpClient5,坑坑坑
我最近要把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.设置默认主机
按照 这篇文章,发现可以覆盖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
目前还没找到这些类的替代方案。
以后找到了,会持续更新