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