В чем разница между 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, но создает ThreadSafeCloseableHttpClient
.
- использовать для создания пользовательских
CloseableHttpClient
.
HttpClients
- не ThreadSafe, но создает ThreadSafeCloseableHttpClient
.
- использовать для создания По умолчанию или минимально
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.