0

我编写了一个 HTTP 客户端,我在其中读取来自 REST Web 服务的数据响应。在阅读了有关 EntityUtils.consume() 和 EntiryUtils.toString() 的多个博客后,我产生了困惑。我想知道以下内容:

  1. 如果 EntityUtils.toString(..) ONLY 就足够了,因为它还会在读取 char 字节后关闭流。或者我也应该做 EntityUtils.consume(..) 作为一个好习惯。

  2. 如果toString() 和consume() 操作都可以使用。如果是,那么应该有什么命令。

  3. 如果我 EntityUtils.toString() 关闭流;那么为什么 EntityUtils.consume(..) 操作中的下一个调用是 entity.isStreaming() 仍然返回 true?

任何人都可以在这里指导我以标准方式使用这些操作。我正在使用 HTTP 版本 4+。

我必须在多线程(网络应用程序)环境中使用这些配置。

谢谢

4

1 回答 1

1

我查看了 apache httpclient commons 网站上的推荐示例。

在示例中,他们使用了 EntityUtils.toString(..) 而无需在前后使用 EntityUtils.consume(..)。

他们提到调用 httpclient.close() 可确保关闭所有资源。

来源:https ://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientWithResponseHandler.java

CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
        HttpGet httpget = new HttpGet("http://httpbin.org/");

        System.out.println("Executing request " + httpget.getRequestLine());

        // Create a custom response handler
        ResponseHandler<String> responseHandler = new ResponseHandler<String>() {

            @Override
            public String handleResponse(
                    final HttpResponse response) throws ClientProtocolException, IOException {
                int status = response.getStatusLine().getStatusCode();
                if (status >= 200 && status < 300) {
                    HttpEntity entity = response.getEntity();
                    return entity != null ? EntityUtils.toString(entity) : null;
                } else {
                    throw new ClientProtocolException("Unexpected response status: " + status);
                }
            }

        };
        String responseBody = httpclient.execute(httpget, responseHandler);
        System.out.println("----------------------------------------");
        System.out.println(responseBody);
    } finally {
        httpclient.close();
    }

这是上面示例中引用的内容:

此示例演示如何使用响应处理程序处理 HTTP 响应。这是执行 HTTP 请求和处理 HTTP 响应的推荐方式。这种方法使调用者能够专注于消化 HTTP 响应的过程,并将系统资源释放的任务委托给 HttpClient。HTTP 响应处理程序的使用保证了底层 HTTP 连接将在所有情况下自动释放回连接管理器。

于 2020-07-09T14:51:47.020 回答