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

新手上路,请多包涵

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

我想了解 Apache HttpClient 并且我已经完成了 这组示例。所有示例都使用 CloseableHttpClient 而不是 HttpClient 。所以我认为 CloseableHttpClientHttpClient 的扩展版本。如果是这种情况,我有两个问题:

  • 这两者有什么区别?
  • 哪个类被推荐用于我的新开发?

原文由 Nayana Adassuriya 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.4k
2 个回答
  • 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 响应 = httpclient.execute(httpget);
  尝试 {
      //做一点事
  } 最后 {
      响应.close();
  }

  • HttpClient 资源释放: 当不再需要 CloseableHttpClient 实例并且即将超出范围时,必须通过调用 CloseableHttpClient#close() 方法关闭与其关联的连接管理器。
   CloseableHttpClient httpclient = HttpClients.createDefault();
  尝试 {
      //做一点事
  } 最后 {
      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
}

原文由 Sagar Pudi 发布,翻译遵循 CC BY-SA 4.0 许可协议

有同样的问题。其他答案似乎没有说明为什么 close() 真的有必要?此外,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 - 线程安全。

DefaultHttpClient - ThreadSafe 但 已弃用,请改用 HttpClientBuilder

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

  • 用于创建自定义 CloseableHttpClient

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

  • 用于创建 DEFAULT 或 CloseableHttpClient

根据 Apache 的首选方式:

 CloseableHttpClient httpclient = HttpClients.createDefault();

他们给出 的示例finally httpclient.close() 中执行 --- ,并且还使用了 ResponseHandler


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

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

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

原文由 euphoria99 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题