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

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

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

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

6 ответов


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

  • CloseableHttpClient-абстрактный класс, который является базовой реализацией HttpClient, который также реализует java.Ио.Закрывается.
  • вот пример процесса выполнения запроса в его простейшей форме:

    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
}

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

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

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

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

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

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

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

на самом деле, я нашел в библиотеке 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 - ThreadSafe но устаревший используйте .

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 еще пример CloseableHttpClient.


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


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

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


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

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

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

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