我正在迁移我的应用程序以使用 HttpClient5,但它变得越来越糟糕。许多 API 被删除,并且没有适当的文档可用于了解替代方案。Stackoverflow/任何其他网站/博客总是显示与 httpcomponents4.x 相关的答案,但这些 API 在 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();
设置默认主机。按照这个如何在 Apache HttpClient 4.3+ 中设置默认 HttpHost 目标?并发现我们可以覆盖但我们不能在 httpclient5 中执行此操作,因为这样声明的方法
determineRoute
无法覆盖。所以我这样做了:DefaultRoutePlanner
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();
HttpRequestBase
替换为HttpUriRequestBase
- 在 HttpRequestBase 上,我们调用 getRequestLine() 来了解正在打印的请求详细信息,如下所示:
POST https://url HTTPS/1.1
但是getRequestLine()
在 HttpUriRequestBase 中删除了 API,所以我这样使用:
httpReq.getMethod()+" "+httpReq.getUri()
但即使我使用它也不是打印协议httpReq.getVersion()
- 没有单独
httpasyncclient
httpcore-nio
的库HttpClient5
- 经过研究,发现所有东西都捆绑在一起httpclient5
-httpcore5
现在更多的斗争从这里开始。以下所有类不再存在。
SSLIOSessionStrategy
NoopIOSessionStrategy
PoolingNHttpClientConnectionManager
DefaultConnectingIOReactor
ConnectingIOReactor
IOReactorException
还不知道这个的替代品。IOReactorConfig
api不清楚。在演示示例中,IOReactorConfig
设置为CloseableHttpAsyncClient
没有 SSLcontext 示例。就我而言,根据现有代码,他们正在使用IOReactorConfig
and SSLContext
。现在不知道如何俱乐部这些。
请建议我做的是否正确。
很多其他人都在那里。会更新。