62
задан 20 August 2015 в 01:32

6 ответов

  • основная точка входа 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(CloseableHttpClient httpclient = HttpClients.createDefault()){
//do something with httpclient here
}
82
ответ дан 31 October 2019 в 13:46

Имел тот же вопрос. Другие ответы, кажется, не обращаются, почему близко () действительно необходимо? Кроме того, Op, казалось, изо всех сил пытался выяснить предпочтительный способ работать с HttpClient, и др.

<час>

Согласно [1 119] 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 - ThreadSafe.

DefaultHttpClient - ThreadSafe, НО удержал от использования , используйте HttpClientBuilder вместо этого.

HttpClientBuilder - НЕ ThreadSafe, НО создает ThreadSafe CloseableHttpClient.

  • Использование для создания ПОЛЬЗОВАТЕЛЬСКИЙ CloseableHttpClient.

HttpClients - НЕ ThreadSafe, НО создает ThreadSafe CloseableHttpClient.

  • Использование для создания ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ или МИНИМАЛЬНЫЙ CloseableHttpClient.

предпочтительный путь согласно Apache:

CloseableHttpClient httpclient = HttpClients.createDefault();

пример , который они дают, делает httpclient.close() в finally пункт и также использует ResponseHandler также.

<час>

Как альтернатива, путь mkyong делает это немного интересно, также:

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

Он не показывает client.close() вызов, но я думал бы, что это необходимо, с тех пор client все еще экземпляр [1 118].

17
ответ дан 31 October 2019 в 13:46

Другие ответы, кажется, не обращаются, почему close() действительно необходимо? * 2

Сомнение на ответе "освобождение ресурса HttpClient".

Это упоминается в старом 3.x документ httpcomponents , который долго вернулся и имеет большое различие от 4.x свеча Гефнера. Помимо объяснения так кратко, который не говорит, каков этот базовый ресурс.

я провел некоторое исследование на 4.5.2 исходных кодах выпуска, нашел реализации CloseableHttpClient:close() в основном только завершения его менеджер соединений.

(к вашему сведению) Вот почему, когда Вы будете использовать общее PoolingClientConnectionManager и звонить клиенту close(), исключение java.lang.IllegalStateException: Connection pool shut down произойдет. Избегать, setConnectionManagerShared работы.

я предпочитаю не , делают CloseableHttpClient:close() после каждого запроса

, я раньше создавал новый http клиентский экземпляр при выполнении запроса и наконец закрывал его. В этом случае это было бы лучше для не вызова close(). С тех пор, если менеджер соединений не имеет "совместно использованного" флага, это будет завершение работы, которое является слишком дорогим для единственного запроса.

На самом деле, я также нашел в библиотеке , clj-http, обертка Clojure по Apache HC 4.5, не звонит close() вообще. Посмотрите func request в файле core.clj

13
ответ дан 31 October 2019 в 13:46

CloseableHttpClient базовый класс httpclient библиотеки, та все использование реализаций. Другие подклассы по большей части удерживаются от использования.

Эти HttpClient интерфейс для этого класса и других классов.

необходимо затем использовать CloseableHttpClient в коде и создать его с помощью HttpClientBuilder. Если необходимо перенести клиент для добавления определенного поведения, необходимо использовать запрос и перехватчики ответа вместо того, чтобы перенестись с HttpClient.

Этот ответ был дан в контексте httpclient-4.3.

2
ответ дан 31 October 2019 в 13:46

В следующей основной версии библиотеки HttpClient интерфейс собирается расшириться Closeable. До тех пор рекомендуется использовать CloseableHttpClient, если совместимость с ранее 4.x версии (4.0, 4.1 и 4.2) не требуется.

8
ответ дан 31 October 2019 в 13:46

HttpClient не класс, это - интерфейс. Вы не можете использовать его для разработки в способе, которым Вы имеете в виду.

то, Что Вы хотите, является классом, который реализует эти HttpClient интерфейс, и это CloseableHttpClient.

8
ответ дан 31 October 2019 в 13:46

Другие вопросы по тегам:

Похожие вопросы: