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