В чем разница между CloseableHttpClient и HttpClient в API Apache HttpClient?
Я изучаю приложение, разработанное нашей компанией. Он использует библиотеку Apache HttpClient. В исходном коде он использует класс HttpClient
для создания экземпляров для подключения к серверу.
Я хочу узнать об Apache HttpClient, и я прошел через этот набор примеров. Все примеры используют CloseableHttpClient
вместо HttpClient
. Поэтому я думаю, что CloseableHttpClient
является расширенной версией HttpClient
. Если это так, у меня есть два вопроса:
- В чем разница между этими двумя?
- Какой класс рекомендуется использовать для моей новой разработки?
Ответы
Ответ 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.