Apache Http EntityUtils.consume () против EntityUtils.toString ()? - PullRequest
0 голосов
/ 09 июля 2020

Я написал HTTP-клиент, в котором я читаю ответ данных от веб-службы REST. Мое замешательство возникает после чтения нескольких блогов по EntityUtils.consume () и EntiryUtils.toString (). Я хотел знать следующее:

  1. Если достаточно только EntityUtils.toString (..), так как он также закрывает поток после чтения байтов char. Или мне также следует использовать EntityUtils.consume (..) в качестве хорошей практики.

  2. Если могут использоваться как toString (), так и операция потребления (). Если да, то какой там порядок.

  3. Если я EntityUtils.toString () закрывает поток; тогда почему следующий вызов операций EntityUtils.consume (..), который является entity.isStreaming (), по-прежнему возвращает истину? . Я использую HTTP версии 4 +.

    Я должен использовать эти конфигурации в многопоточной среде (веб-приложение).

    Спасибо

1 Ответ

1 голос
/ 09 июля 2020

Я просмотрел рекомендуемый пример с веб-сайта apache httpclient commons.

В этом примере они использовали EntityUtils.toString (..) без необходимости использовать EntityUtils.consume (..) до или after.

Они упоминают, что вызов httpclient.close () гарантирует, что все ресурсы закрыты.

source: 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-соединение будет возвращено диспетчеру соединений автоматически во всех случаях.

...