В чем разница между 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.