HttpClient — это библиотека реализации HTTP-связи на стороне клиента. Цель HttpClient — отправлять и получать HTTP-сообщения.
Думаю, нет необходимости больше говорить о важности протокола Http. По сравнению с URLConnection, который поставляется с традиционным JDK, HttpClient отличается большей простотой использования и гибкостью (конкретные различия мы обсудим в будущем). Это не только способ отправки клиентом Http-запросов. Он также позволяет разработчикам тестировать интерфейс (на основе протокола HTTP), что повышает эффективность разработки и повышает надежность кода. Поэтому владение HttpClient очень важно и обязательно. После освоения HttpClient я считаю, что понимание протокола Http станет более глубоким.
1. Введение
HttpClient — это подпроект Apache Jakarta Common, используемый для предоставления эффективного, современного и многофункционального набора инструментов клиентского программирования, поддерживающего протокол HTTP, а также последнюю версию и рекомендации протокола HTTP. HttpClient использовался во многих проектах. Например, два других известных проекта с открытым исходным кодом на Apache Jakarta, Cactus и HTMLUnit, используют HttpClient.
Адрес загрузки: http://hc.apache.org/downloads.cgi.
2. Характеристики
1. На основе стандартного и чистого языка Java. Реализованы Http1.0 и Http1.1.
2. Реализует все методы Http (GET, POST, PUT, DELETE, HEAD, OPTIONS и TRACE) с расширяемой объектно-ориентированной структурой.
3. Поддержка протокола HTTPS.
4. Установите прозрачное соединение через HTTP-прокси.
5. Используйте метод CONNECT, чтобы установить туннелированное соединение https через прокси-сервер Http.
6. Базовый, дайджест, NTLMv1, NTLMv2, сеанс NTLM2, схема аутентификации SNPNEGO/Kerberos.
7. Подключаемая пользовательская схема аутентификации.
8. Портативная и надежная фабрика розеток упрощает использование сторонних решений.
9. Менеджер соединений поддерживает многопоточные приложения. Поддерживает установку максимального количества подключений, а также настройку максимального количества подключений для каждого хоста, а также обнаруживает и закрывает просроченные подключения.
10. Автоматически обрабатывать файлы cookie в Set-Cookie.
11. Политика использования файлов cookie подключаемого модуля.
12. Выходной поток запроса может избежать буферизации содержимого потока непосредственно на сервер сокетов.
13. Входной поток ответа может эффективно считывать соответствующий контент непосредственно с сервера сокетов.
14. Используйте KeepAlive для поддержания постоянных соединений в http1.0 и http1.1.
15. Непосредственно получите код ответа и заголовки, отправленные сервером.
16. Возможность установки таймаута соединения.
17. Экспериментальная поддержка кэширования ответов http1.1.
18. Исходный код доступен бесплатно по лицензии Apache.
3. Как использовать
Использовать HttpClient для отправки запросов и получения ответов очень просто. Обычно требуются следующие шаги.
1. Создайте объект HttpClient.
2. Создайте экземпляр метода запроса и укажите URL-адрес запроса. Если вам нужно отправить запрос GET, создайте объект HttpGet, если вам нужно отправить запрос POST, создайте объект HttpPost;
3. Если вам нужно отправить параметры запроса, вы можете вызвать метод setParams (HetpParams params), общий для HttpGet и HttpPost, чтобы добавить параметры запроса для объекта HttpPost, вы также можете вызвать метод setEntity (объект HttpEntity) для установки запроса; параметры.
4. Вызовите выполнение (запрос HttpUriRequest) объекта HttpClient для отправки запроса. Этот метод возвращает HttpResponse.
5. Вызовите методы getAllHeaders(), getHeaders(String name) и другие методы HttpResponse, чтобы получить заголовки ответа сервера; вызовите метод getEntity() HttpResponse, чтобы получить объект HttpEntity, который оборачивает содержимое ответа сервера. Программа может получить содержимое ответа сервера через этот объект.
6. Разорвите соединение. Независимо от того, успешен метод выполнения или нет, соединение необходимо освободить.
4. Примеры
пакет com.test; импорт java.io.FileInputStream; импорт java.io.UnsupportedEncodingException; импорт java.security.KeyStore; безопасность.KeyStoreException импорт java.security.NoSuchAlgorithmException; java.security.cert.CertificateException; импорт java.util.List; импорт javax.net.ssl.SSLContext; импорт org.apache.http.NameValuePair; org.apache.http.ParseException импорт org.apache.http.client.ClientProtocolException; org.apache.http.client.entity.UrlEncodedFormEntity; импорт org.apache.http.client.methods.CloseableHttpResponse; импорт org.apache.http.client.methods.HttpGet; импорт org.apache.http.client.methods.HttpPost; ;импорт org.apache.http.conn.ssl.SSLConnectionSocketFactory; импорт org.apache.http.conn.ssl.SSLContexts; импорт org.apache.http.conn.ssl.TrustSelfSignedStrategy; импорт org.apache.http.entity.ContentType; org.apache.http.entity.mime.MultipartEntityBuilder импорт; org.apache.http.entity.mime.content.FileBody; импорт org.apache.http.entity.mime.content.StringBody; импорт org.apache.http.impl.client.CloseableHttpClient; импорт org.apache.http.impl; .client.HttpClients импорт org.apache.http.message.BasicNameValuePair; org.apache.http.util.EntityUtils; import org.junit.Test; public class HttpClientTest { @Test public void jUnitTest() { get(); } /** * HttpClient подключается к SSL */ public void ssl() { CloseableHttpClient httpclient = null попробуйте {KeyStoretrustStore =; KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new File("d://tomcat.keystore") try { // Загрузить хранилище ключей d://tomcat.keystoretrustStore.load(instream); , "123456".toCharArray()); } catch (CertificateException e) { e.printStackTrace() } наконец { try; { instream.close(); } catch (игнорирование исключений) { } } // Доверяйте своему собственному ЦС и всем самоподписанным сертификатам SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build() ; // Разрешить использование только протокола TLSv1 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build() // Создание http-запроса (режим получения) HttpGet httpget = новый HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("выполнение запроса" + httpget.getRequestLine()); CloseableHttpResponse ответ = httpclient.execute(httpget); { HttpEntityentity = response.getEntity(); System.out.println("--------------------------------- -------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("Длина содержимого ответа: " +entity.getContentLength System.out.println(EntityUtils.toString) (сущность)); EntityUtils.consume(сущность); } } наконец {response.close() } } catch; (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace() } наконец { if (httpclient != null) { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * Отправьте форму в режиме публикации (имитируйте запрос на вход пользователя) */ public void postForm() { // Создаем экземпляр httpClient по умолчанию CloseableHttpClient httpclient = HttpClients.createDefault(); // Создаем httppost HttpPost httppost = new. HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // Создание очереди параметров List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("username" , "admin")); formparams.add(new BasicNameValuePair("пароль", "123456"); UrlEncodedFormEntity uefEntity; попробуйте { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); System.out.println("выполнение запроса" + httppost.getURI()); Ответ CloseableHttpResponse = httpclient.execute (httppost); попробуйте { HttpEntityentity = response.getEntity(); if (entity!= null) { System.out.println("-------------------------- ------------"); System.out.println("Содержимое ответа: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("-- ------------------------------------"); } } наконец { response.close(); } } ловить (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace() } наконец { // Закрываем соединение и освобождаем ресурсы try { httpclient .close(); } catch (IOException e) { e.printStackTrace() } } /** *; Отправьте запрос на публикацию для доступа к локальному приложению и возвращайте разные результаты в соответствии с разными переданными параметрами */ public void post() { // Создаем экземпляр httpClient по умолчанию httpclient = HttpClients.createDefault(); // Создаем httppost HttpPost httppost. = новый HttpPost(" http://localhost:8080/myDemo/Ajax/serivceJ.action"); // Создать очередь параметров List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("type", "house")); UrlEncodedFormEntity uefEntity; try { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8) "); httppost.setEntity(uefEntity); System.out.println("выполнение запроса" + httppost.getURI()); CloseableHttpResponse ответ = httpclient.execute(httppost); try { HttpEntityentity = response.getEntity(); if (entity!= null) { System.out .println("------------------------------------------"); .out.println(Содержимое ответа: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("---------------------------- ---------"); } }finally {Response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } поймать (IOException е) { e.printStackTrace(); }finally { // Закрываем соединение и освобождаем ресурсы try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); /** * Отправляем запрос на получение* / public void get() { CloseableHttpClient httpclient = HttpClients.createDefault() try { // Создать httpget. httpget = new. HttpGet("http://www.baidu.com/"); System.out.println("выполнение запроса" + httpget.getURI()); // Выполнение запроса на получение CloseableHttpResponse = httpclient.execute(httpget); try { // Получаем объект ответа HttpEntityentity = response.getEntity(); System.out.println("-------------------------- ----------"); // Распечатать статус ответа System.out.println(response.getStatusLine()); if (entity != null) { // Распечатать длину содержимого ответа System.out.println("Длина содержимого ответа: " +entity.getContentLength()); //Распечатываем содержимое ответа System.out.println("Содержимое ответа: " + EntityUtils.toString(entity) }); System.out.println("----------------------------------------"); } наконец {ответ .close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace() } catch (IOException e) { e.printStackTrace(); наконец { // Закрываем соединение и освобождаем ресурсы try { httpclient.close() } catch (IOException); e) { e.printStackTrace(); } } } /** * Загрузить файлы*/ public void upload() { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost("http://localhost: 8080/myDemo/Ajax/serivceFile.action"); FileBody bin = новый FileBody(новый File("F://image//sendpix0.jpg")); StringBody comment = new StringBody("Какой-то двоичный файл", ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin ", bin).addPart("комментарий", комментарий).build(); httppost.setEntity(reqEntity); System.out.println("выполнение запроса" + httppost.getRequestLine()); CloseableHttpResponse ответ = httpclient.execute(httppost); try { System.out.println("------------- -----------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = response. getEntity(); если (resEntity != null) { System.out.println("Длина содержимого ответа: " + resEntity.getContentLength() } EntityUtils.consume(resEntity); } наконец {Response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace() } наконец {попробуйте { httpclient.close(); } catch (IOException e) { e.printStackTrace() } } } </namevaluepair></namevaluepair></namevaluepair></namevaluepair>;
В этом примере используется последняя версия HttpClient4.3. Эта версия сильно отличается от предыдущего стиля написания кода, поэтому обратите на нее больше внимания.
Хорошо, выше приведено все содержание этой статьи, надеюсь, она вам понравится.