Подтвердить что ты не робот

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

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

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

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

Ответ 1

  • Основной точкой входа API HttpClient является интерфейс 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 больше не нужен и собирается выйти из области видимости, связанный с ним диспетчер подключений должен быть отключен, вызвав Close CloseHttpClient # 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
}

Ответ 2

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

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

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

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

(FYI). Поэтому, когда вы используете общий 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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Был тот же вопрос. Другие ответы, похоже, не затрагивают, почему 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 BUT устарел, используйте HttpClientBuilder вместо этого.

  

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

  •   
  • Использовать для создания CUSTOM CloseableHttpClient.  

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

  •   
  • Используйте для создания DEFAULT или MINIMAL CloseableHttpClient.  

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

CloseableHttpClient httpclient = HttpClients.createDefault();

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


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

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

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

Ответ 6

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

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

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

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