HttpClient es una biblioteca de implementación de comunicación HTTP del lado del cliente. El objetivo de HttpClient es enviar y recibir mensajes HTTP.
Creo que no necesito decir más sobre la importancia del protocolo Http. En comparación con la URLConnection que viene con el JDK tradicional, HttpClient tiene una mayor facilidad de uso y flexibilidad (discutiremos las diferencias específicas en el futuro). No solo es una forma sencilla para que el cliente envíe solicitudes Http, sino que también facilita a los desarrolladores probar la interfaz (basada en el protocolo HTTP), lo que mejora la eficiencia del desarrollo y mejora la solidez del código. Por lo tanto, dominar HttpClient es muy importante y obligatorio. Después de dominar HttpClient, creo que la comprensión del protocolo Http será más profunda.
1. Introducción
HttpClient es un subproyecto de Apache Jakarta Common, que se utiliza para proporcionar un conjunto de herramientas de programación de cliente eficiente, actualizado y rico en funciones que admite el protocolo HTTP y admite la última versión y recomendaciones del protocolo HTTP. HttpClient se ha utilizado en muchos proyectos. Por ejemplo, otros dos proyectos famosos de código abierto en Apache Jakarta, Cactus y HTMLUnit, utilizan HttpClient.
Dirección de descarga: http://hc.apache.org/downloads.cgi
2. Características
1. Basado en lenguaje Java estándar y puro. Implementado Http1.0 y Http1.1
2. Implementa todos los métodos Http (GET, POST, PUT, DELETE, HEAD, OPTIONS y TRACE) con una estructura extensible orientada a objetos.
3. Admite protocolo HTTPS.
4. Establezca una conexión transparente a través del proxy HTTP.
5. Utilice el método CONNECT para establecer una conexión https en túnel a través del proxy Http.
6. Básico, Digest, NTLMv1, NTLMv2, Sesión NTLM2, esquema de autenticación SNPNEGO/Kerberos.
7. Esquema de autenticación personalizado del complemento.
8. La fábrica de enchufes portátil y confiable facilita el uso de soluciones de terceros.
9. El administrador de conexiones admite aplicaciones multiproceso. Admite configurar la cantidad máxima de conexiones, así como también configurar la cantidad máxima de conexiones para cada host, y descubre y cierra conexiones caducadas.
10. Manejar automáticamente las cookies en Set-Cookie.
11. Política de cookies personalizada del complemento.
12. El flujo de salida de Solicitud puede evitar almacenar en búfer el contenido del flujo directamente en el servidor de socket.
13. El flujo de entrada de Respuesta puede leer efectivamente el contenido correspondiente directamente desde el servidor de socket.
14. Utilice KeepAlive para mantener conexiones persistentes en http1.0 y http1.1.
15. Obtenga directamente el código de respuesta y los encabezados enviados por el servidor.
16. Posibilidad de configurar el tiempo de espera de la conexión.
17. Soporte experimental para el almacenamiento en caché de respuestas http1.1.
18. El código fuente está disponible gratuitamente bajo la licencia Apache.
3. Cómo utilizar
Es muy sencillo utilizar HttpClient para enviar solicitudes y recibir respuestas. Generalmente, se requieren los siguientes pasos.
1. Cree un objeto HttpClient.
2. Cree una instancia del método de solicitud y especifique la URL de solicitud. Si necesita enviar una solicitud GET, cree un objeto HttpGet; si necesita enviar una solicitud POST, cree un objeto HttpPost.
3. Si necesita enviar parámetros de solicitud, puede llamar al método setParams (parámetros HetpParams) común a HttpGet y HttpPost para agregar parámetros de solicitud para el objeto HttpPost; también puede llamar al método setEntity (entidad HttpEntity) para configurar la solicitud; parámetros.
4. Llame a ejecutar (solicitud HttpUriRequest) del objeto HttpClient para enviar la solicitud. Este método devuelve un HttpResponse.
5. Llame a getAllHeaders (), getHeaders (nombre de cadena) de HttpResponse y otros métodos para obtener los encabezados de respuesta del servidor; llame al método getEntity () de HttpResponse para obtener el objeto HttpEntity, que envuelve el contenido de la respuesta del servidor. El programa puede obtener el contenido de la respuesta del servidor a través de este objeto.
6. Libere la conexión. Independientemente de si el método de ejecución es exitoso o no, la conexión debe liberarse
4. Ejemplos
paquete com.test; importar java.io.File; importar java.io.FileInputStream; importar java.io.IOException; importar java.security.KeyStore; seguridad.KeyStoreException; importar java.security.NoSuchAlgorithmException; java.security.cert.CertificateException; importar java.util.ArrayList; importar java.util.List; importar javax.net.ssl.SSLContext; importar org.apache.http.HttpEntity; org.apache.http.ParseException; importar org.apache.http.client.ClientProtocolException; org.apache.http.client.entity.UrlEncodedFormEntity; importar org.apache.http.client.methods.CloseableHttpResponse; importar org.apache.http.client.methods.HttpGet; ;importar org.apache.http.conn.ssl.SSLConnectionSocketFactory; importar org.apache.http.conn.ssl.SSLContexts; importar org.apache.http.conn.ssl.TrustSelfSignedStrategy; org.apache.http.entity.mime.MultipartEntityBuilder importar; org.apache.http.entity.mime.content.FileBody; importar org.apache.http.entity.mime.content.StringBody; importar org.apache.http.impl.client.CloseableHttpClient; .client.HttpClients; importar org.apache.http.message.BasicNameValuePair; org.apache.http.util.EntityUtils; import org.junit.Test; clase pública HttpClientTest { @Test public void jUnitTest() { get() } /** * HttpClient se conecta a SSL */ public void ssl(); CloseableHttpClient httpclient = null prueba { KeyStore trustStore =; KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new File("d://tomcat.keystore") prueba { // Cargar keyStore d://tomcat.keystore trustStore.load(instream) , "123456".toCharArray()); } catch (CertificateException e) { e.printStackTrace() } finalmente { intentar { instream.close() } catch (Exception ignore) { } } // Confíe en su propia CA y en todos los certificados autofirmados SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build() ; // Solo permite el uso del protocolo TLSv1 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build() // Crear solicitud http (modo de obtención) HttpGet httpget = nuevo HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("ejecutando solicitud" + httpget.getRequestLine()); CloseableHttpResponse respuesta = httpclient.execute(httpget); { entidad HttpEntity = respuesta.getEntity(); System.out.println("--------------------------------- -------"); System.out.println(response.getStatusLine()); if (entity!= null) { System.out.println("Longitud del contenido de la respuesta: " + entidad.getContentLength()); (entidad)); EntityUtils.consume(entidad); } } finalmente { respuesta.close(); (ParseException e) { e.printStackTrace() } captura (IOException e) { e.printStackTrace() } captura (KeyManagementException e) { e.printStackTrace() } captura (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); finalmente { if (httpclient! = nulo) { try { httpclient.close() } catch (IOException e) { e.printStackTrace(); } } } } /** * Envíe el formulario en modo de publicación (simule la solicitud de inicio de sesión del usuario) */ public void postForm() { // Crea una instancia de httpClient predeterminada CloseableHttpClient httpclient = HttpClients.createDefault() // Crea httppost HttpPost httppost = new; HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // Crear cola de parámetros List<namevaluepair> formparams = new ArrayList<namevaluepair>(); , "admin")); formparams.add(new BasicNameValuePair("contraseña", "123456")); UrlEncodedFormEntity uefEntity; intente { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity) System.out.println("solicitud de ejecución" + httppost.getURI()); (httppost); prueba { HttpEntity entidad = respuesta.getEntity(); if (entidad! = nulo) { System.out.println("-------------------------- ------------"); System.out.println("Contenido de la respuesta: " + EntityUtils.toString(entidad, "UTF-8")); System.out.println("-- ------------------------------------"); } } finalmente { respuesta.cerrar(); } } atrapar (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace() } finalmente { // Cerrar la conexión y liberar recursos try { httpclient .close(); } captura (IOException e) { e.printStackTrace(); Envíe una solicitud de publicación para acceder a la aplicación local y devolver resultados diferentes según los diferentes parámetros pasados */ public void post() { // Crea una instancia httpClient predeterminada CloseableHttpClient httpclient = HttpClients.createDefault() // Crea un httppost HttpPost httppost. = nuevo HttpPost(" http://localhost:8080/myDemo/Ajax/serivceJ.action"); Crear cola de parámetros List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("type", "house")); "); httppost.setEntity(uefEntity); System.out.println("ejecutando solicitud " + httppost.getURI()); CloseableHttpResponse respuesta = httpclient.execute(httppost); intente { HttpEntity entidad = respuesta.getEntity(); .println("------------------------------------------"); .out.println ("Contenido de la respuesta: " + EntityUtils.toString(entidad, "UTF-8")); System.out.println("----------------------- ---------"); } } finalmente { respuesta.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } captura (IOException e) { e.printStackTrace(); } finalmente { // Cerrar la conexión y liberar recursos try { httpclient.close() } catch (IOException e) { e.printStackTrace() } } } /** * Enviar una solicitud de obtención*; / public void get() { CloseableHttpClient httpclient = HttpClients.createDefault() prueba { // Crear httpget. HttpGet("http://www.baidu.com/"); System.out.println("ejecutando solicitud " + httpget.getURI()); // Ejecutar solicitud de obtención. Respuesta CloseableHttpResponse = httpclient.execute(httpget); try { // Obtener la entidad de respuesta HttpEntity entidad = respuesta.getEntity() System.out.println("--------------------------) ----------"); // Imprimir estado de respuesta System.out.println(response.getStatusLine()); if (entity!= null) { // Imprimir longitud del contenido de la respuesta System.out.println("Longitud del contenido de la respuesta: " + entidad.getContentLength()); //Imprime el contenido de la respuesta System.out.println("Contenido de la respuesta: " + EntityUtils.toString(entity)); System.out.println("----------------------------------------"); } finalmente { respuesta .close(); } } captura (ClientProtocolException e) { e.printStackTrace(); captura (ParseException e) { e.printStackTrace() } captura (IOException e) { e.printStackTrace(); finalmente { // Cierra la conexión y libera recursos intenta { httpclient.close() } catch (IOException); e) { e.printStackTrace(); } } } /** * Cargar archivos*/ public void upload() { CloseableHttpClient httpclient = HttpClients.createDefault() prueba { HttpPost httppost = new HttpPost("http://localhost: 8080/myDemo/Ajax/serivceFile.action"); FileBody bin = nuevo FileBody(nuevo File("F://image//sendpix0.jpg")); StringBody comment = new StringBody("Un archivo binario de algún tipo", ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin) ", bin).addPart("comentario", comentario).build(); httppost.setEntity(reqEntity); System.out.println("ejecutando solicitud " + httppost.getRequestLine()); respuesta CloseableHttpResponse = httpclient.execute(httppost); System.out.println("------------- -----------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = respuesta. obtenerEntidad( ); si (resEntidad != null) { System.out.println("Longitud del contenido de la respuesta: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity } finalmente { respuesta.close() } } catch (ClientProtocolException e) { e.printStackTrace(); } captura (IOException e) { e.printStackTrace() } finalmente { intentar { httpclient.close() } catch (IOException e) { e.printStackTrace() } } } }</namevaluepair></namevaluepair></namevaluepair></namevaluepair>
Este ejemplo utiliza la última versión de HttpClient4.3. Esta versión es bastante diferente del estilo de escritura de código anterior, así que preste más atención.
Bien, lo anterior es el contenido completo de este artículo, espero que les guste.