Apache HttpClient API中的CloseableHttpClient和HttpClient有什么区别?

2022-08-31 09:22:41

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

我想了解Apache HttpClient,我已经了解了这组示例。所有示例都使用 代替 。所以我认为是的扩展版本。如果是这种情况,我有两个问题:CloseableHttpClientHttpClientCloseableHttpClientHttpClient

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

答案 1
  • HttpClient API的主要入口点是HttpClient接口。
  • HttpClient最重要的功能是执行HTTP方法。
  • HTTP方法的执行涉及一个或多个HTTP请求/ HTTP响应交换,通常由HttpClient内部处理。

  • CloseableHttpClient是一个抽象类,它是HttpClient的基本实现,它也实现了java.io.Closeable。
  • 以下是最简单的请求执行过程的示例:

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

  • HttpClient 资源解除分配:当不再需要 CloseableHttpClient 实例并且即将超出范围时,必须通过调用 CloseableHttpClient#close() 方法关闭与其关联的连接管理器。

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

请参阅参考以了解基础知识。


@Scadge 从 Java 7 开始,使用 try-with-resources 语句可确保在语句末尾关闭每个资源。它既可用于客户端,也可用于每个响应

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
}

答案 2

有同样的问题。其他答案似乎没有解决为什么close()真的有必要?此外,Op似乎正在努力找出使用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- 线程安全但已弃用,请改用。HttpClientBuilder

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

  • 用于创建自定义 。CloseableHttpClient

HttpClients- 不是线程安全,而是创建线程安全。CloseableHttpClient

  • 用于创建默认或最小 。CloseableHttpClient

根据Apache的首选方式:

CloseableHttpClient httpclient = HttpClients.createDefault();

他们给出的例子在子句中确实如此,并且也使用了。httpclient.close()finallyResponseHandler


作为替代方案,mkyong这样做的方式也有点有趣:

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

他没有显示呼叫,但我认为这是必要的,因为仍然是.client.close()clientCloseableHttpClient


推荐