当前位置: 首页 > 知识库问答 >
问题:

ApacheHttpClient API中CloseableHttpClient和HttpClient之间的区别是什么?

穆宾白
2023-03-14

我正在研究我们公司开发的一个应用程序。它使用Apache HttpClient库。在源代码中,它使用HttpClient类来创建连接到服务器的实例。

我想了解ApacheHttpClient,我已经详细介绍了这组示例。所有示例都使用CloseableHttpClient而不是HttpClient。因此我认为CloseableHttpClientHttpClient的扩展版本。如果是这种情况,我有两个问题:

  • 这两者有什么区别?
  • 我的新开发建议使用哪个类?

共有3个答案

师赤岩
2023-03-14

其他答案似乎没有解决为什么off()真的有必要?*二

它在旧的3中提到。x httpcomponents文档,它很长,与4有很大的不同。x HC。除此之外,解释非常简短,没有说明这个潜在资源是什么。

我对4.5.2版本的源代码做了一些研究,发现CloseableHttpClient的实现基本上只关闭了它的连接管理器。

(仅供参考)这就是为什么当您使用共享池客户端连接管理器并调用客户端close(),异常java时。lang.IllegalStateException:将发生连接池关闭。为了避免这种情况,setConnectionManagerShared起作用。

我曾经在做请求时创建一个新的超文本传输协议客户端实例,最后关闭它。在这种情况下,最好不要调用off()。因为,如果连接管理器没有“共享”标志,它将被关闭,这对于单个请求来说太昂贵了。

事实上,我还发现在库cljhttp中,apachehc4.5上的Clojure包装器根本不调用close()。请参阅文件核心中的func请求。clj

凤晨朗
2023-03-14

有同样的问题。其他的答案似乎并没有说明为什么关闭()真的是必要的?此外,Op似乎正在努力找出与HttpClient等合作的首选方式。

根据阿帕奇的说法:

// 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-ThreadSafe。

DefaultHttpClient-线程安全但已弃用,请改用HttpClientBuilder

HttpClientBuilder-不是线程安全的,而是创建线程安全的CloseableHttpClient

  • 用于创建自定义CloseableHttpClient

httpclient-不是线程安全的,而是创建线程安全的CloseableHttpClient

  • 用于创建DEFAULT或MINIMALCloseableHttpClient.

根据Apache的首选方式:

CloseableHttpClient httpclient = HttpClients.createDefault();

他们给出的示例不支持httpclient。close()在finally子句中,还使用了ResponseHandler

作为替代方案,mkyong的做法也有点有趣:

HttpClient client = HttpClientBuilder.create().build();

他没有显示client.close()调用,但我认为这是必要的,因为客户端仍然是CloseableHttpClient的实例。

云开诚
2023-03-14
  • HttpClient API的主要入口点是HttpClient接口

>

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {
    //do something
} finally {
    response.close();
}

>

  • HttpClient资源释放:当不再需要一个实例CloseableHttpClient并且即将超出范围时,必须通过调用CloseableHttpClient#off()方法关闭与之关联的连接管理器。

    CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
        //do something
    } finally {
        httpclient.close();
    }

    请参阅参考资料以了解基础知识

    @Scadge自Java7起,使用try-with-资源语句可确保每个资源在语句末尾关闭。它可以用于客户端和每个响应

    try(CloseableHttpClient httpclient = HttpClients.createDefault()){
    
        // e.g. do this many times
        try (CloseableHttpResponse response = httpclient.execute(httpget)) {
        //do something
        }
    
        //do something else with httpclient here
    }
    

  •  类似资料:
    • 在Java 7之前,JVM内存中有一个名为PermGen的区域,JVM以前在这里保存它的类。在Java 8中,它被移除并被称为元空间的区域所取代。 PermGen和Metaspace之间最重要的区别是什么? 我知道的唯一区别是,并且忽略了VM参数。

    • 和之间有什么区别? 是什么原因导致他们被扔?如何解决这些问题? 在修改现有代码以包含新的jar文件时,我经常会遇到这些可抛物。我在通过WebStart发布的一个Java应用程序的客户端和服务器端都碰到了它们。 我遇到的可能原因是: 代码客户端的中未包含的包 我们正在使用的新JAR缺少运行时类路径 版本与以前的JAR冲突 当我今天遇到这些问题时,我会采取跟踪和错误的方法来使事情正常工作。我需要更多的

    • 当我试图在Spring4.x上进行测试时,我使用了MockMvc web客户端,但我正在阅读和尝试Spring5.x的新特性。 我认为,WebTestClient和MockMvc是相同或非常相似的。 MockMvc和WebTestClient之间的区别是什么?

    • 有人能给我解释一下map和flatMap之间的区别,以及什么是各自的好用例吗? “结果扁平化”是什么意思?它有什么好处?

    • 问题内容: 两者之间有什么区别(标记为评论): -如果它确定在建立连接之前的超时。 -如果确定两个连续数据包之间的不活动时间段或时间差, 那么下面的一个是做什么的: 问题答案: 最低级别的HTTP是TCP套接字。因此,当您请求URL并获得响应时,在较低级别上,将创建一个客户端套接字,该客户端套接字建立与远程服务器套接字的连接,发送一些数据并接收响应。 setConnectionTimeout :客

    • 给定以下从静态编程语言Koans中提取的代码: 我自己的解决方案使用了。两者都适用于koan场景。 和的文档似乎非常相似。 这两个功能有什么区别?