В чем разница между CloseableHttpClient и HttpClient в Apache HttpClient API?


Я изучаю приложение, разработанное нашей компанией. Он использует библиотеку Apache HttpClient. В исходном коде он использует HttpClient класса для создания экземпляров для подключения к серверу.

Я хочу узнать о Apache HttpClient и я пошел корыто этот набор примеров. Все примеры используют CloseableHttpClient вместо HttpClient. Так что я думаю CloseableHttpClient является расширенной версией HttpClient. Если это так, у меня есть два вопроса:

  • что разница между этими двумя?
  • какой класс рекомендуется использовать для новых разработок?
6 51

6 ответов:

  • основной точкой входа API HttpClient является интерфейс HttpClient.
  • наиболее важной функцией HttpClient является выполнение методов HTTP.
  • выполнение метода HTTP включает в себя один или несколько обменов HTTP-запросами / HTTP-ответами, обычно обрабатываемых внутри HttpClient.

  • CloseableHttpClient-это абстрактный класс, который является базовой реализацией HttpClient, который также реализует Ява.Ио.Закрывающиеся.
  • вот пример процесса выполнения запроса в самом простом виде:

    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()){
//do something with httpclient here
}

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

сомневаюсь на ответ "с помощью HttpClient освобождения ресурсов".

это упоминается в старом 3.x httpcomponents doc, который долго назад и имеет большую разницу от 4.х ХК. Кроме того, объяснение настолько кратко, что не говорит, что это основной ресурс.

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

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

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

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

на самом деле, я нашел в библиотеке clj-http, оболочка Clojure над Apache HC 4.5, не вызывает close() на всех. Вижу кнопку func request в файле ядра.clj

тот же вопрос. Другие ответы, похоже, не касаются того, почему 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 - ThreadSafe.

DefaultHttpClient - ориентирована на многопотоковое исполнение, но устаревший используйте .

HttpClientBuilder - не ориентирован на многопотоковое исполнение, но создает многопотоковое исполнение CloseableHttpClient.

  • использовать для создания пользовательских CloseableHttpClient.

HttpClients - не ориентирован на многопотоковое исполнение, но создает многопотоковое исполнение CloseableHttpClient.

  • использовать для создания По умолчанию или минимально CloseableHttpClient.

предпочтительный способ в соответствии с Apache:

CloseableHttpClient httpclient = HttpClients.createDefault();

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


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

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

он не показывает client.close() звонок, но я думаю, что это необходимо, так как client еще экземпляр CloseableHttpClient.

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

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

что вы хотите-это класс, который реализует HttpClient интерфейс, и это CloseableHttpClient.

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

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

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

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