Apache HttpClient API中的CloseableHttpClient和HttpClient有什么不同?
我正在学习我们公司开发的应用程序。 它使用Apache HttpClient库。 在源代码中,它使用HttpClient
类来创build实例以连接到服务器。
我想了解一下Apache HttpClient,我已经走过这一套例子 。 所有的例子都使用CloseableHttpClient
而不是HttpClient
。 所以我认为CloseableHttpClient
是HttpClient
的扩展版本。 如果是这种情况,我有两个问题:
- 这两者有什么区别?
- 我的新开发推荐使用哪个类?
- HttpClient API的主要入口点是HttpClient接口。
- HttpClient最重要的function是执行HTTP方法。
- 执行HTTP方法涉及一个或多个HTTP请求/ HTTP响应交换,通常由HttpClient内部处理。
- CloseableHttpClient是一个抽象类,它是实现java.io.Closeable的HttpClient的基本实现。
-
下面是最简单的请求执行过程示例:
CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpget = new HttpGet(“http:// localhost /”); CloseableHttpResponse response = httpclient.execute(httpget); 尝试{ //做一点事 最后{ response.close(); }
-
HttpClient资源释放:当不再需要实例CloseableHttpClient并且即将超出范围时,必须通过调用CloseableHttpClient#close()方法closures与其关联的连接pipe理器。
CloseableHttpClient httpclient = HttpClients.createDefault(); 尝试{ //做一点事 最后{ httpclient.close(); }
参考参考学习基础知识。
@Scadge自Java 7以来,使用try-with-resources语句可确保在语句结束时closures每个资源。
try(CloseableHttpClient httpclient = HttpClients.createDefault()){ //do something with httpclient here }
其他的答案似乎并没有解释为什么close()
是真的有必要吗? * 2
怀疑答案是“HttpClient资源释放”。
它在旧的3.x httpcomponents doc中被提及,这个文件早已与4.x HC有很大不同。 除了这个解释是如此简短,并没有说这个底层资源是什么。
我在4.5.2发布源代码上做了一些研究,发现了CloseableHttpClient:close()
的实现CloseableHttpClient:close()
基本上只closures它的连接pipe理器。
(FYI)这就是为什么当你使用一个共享的PoolingClientConnectionManager
并调用客户端close()
,exceptionjava.lang.IllegalStateException: Connection pool shut down
会发生。 为了避免, setConnectionManagerShared
起作用。
我更喜欢在每个请求之后不要执行CloseableHttpClient:close()
我用来做请求时创build一个新的http客户端实例,最后closures它。 在这种情况下,最好不要调用close()
。 因为如果连接pipe理器没有“共享”标志,它将被closures,这对于单个请求来说太昂贵了。
实际上,我也在库clj-http中find了一个Apache HC 4.5的Clojure包装器,根本不叫close()
。 请参阅文件core.clj中的 func request
在库的下一个主要版本中, HttpClient
接口将扩展为Closeable
。 在此之前,如果CloseableHttpClient
与早期的4.x版本( CloseableHttpClient
和4.2)兼容,那么build议使用CloseableHttpClient
。
HttpClient
不是一个类,它是一个接口。 你不能用你的意思来开发它。
你想要的是一个实现了HttpClient
接口的类,那就是CloseableHttpClient
。
有同样的问题。 其他的答案似乎并没有解释为什么close()是真的有必要吗? 此外,欧普似乎正在努力找出与HttpClient等合作的首选方式。
根据Apache :
// The underlying HTTP connection is still held by the response object // to allow the response content to be streamed directly from the network socket. // In order to ensure correct deallocation of system resources // the user MUST call CloseableHttpResponse#close() from a finally clause.
另外,关系如下:
HttpClient
(接口)执行:
CloseableHttpClient
– 线程安全。
DefaultHttpClient
– ThreadSafe但不推荐使用 ,而是使用HttpClientBuilder
。
HttpClientBuilder
– 不是ThreadSafe,但创buildThreadSafeCloseableHttpClient
。
- 用来创buildCUSTOM
CloseableHttpClient
。
HttpClients
– 不是ThreadSafe,但创buildThreadSafeCloseableHttpClient
。
- 用来创buildDEFAULT或
CloseableHttpClient
。
根据Apache的首选方法:
CloseableHttpClient httpclient = HttpClients.createDefault();
他们给出的例子在finally
子句中使用了httpclient.close()
,并且也使用了ResponseHandler
。
另外,mkyong的做法也有点有趣:
HttpClient client = HttpClientBuilder.create().build();
他不显示client.close()
调用,但我认为这是必要的,因为client
仍然是一个CloseableHttpClient
的实例。
CloseableHttpClient
是所有实现使用的httpclient库的基类。 其他的子类大部分已被弃用。
HttpClient
是这个类和其他类的接口。
你应该在代码中使用CloseableHttpClient
,并使用HttpClientBuilder
创build它。 如果您需要包装客户端以添加特定行为,则应使用请求和响应拦截器而不是使用HttpClient
进行包装。
这个答案是在httpclient-4.3的上下文中给出的。