HttpClient est une bibliothèque d'implémentation de communication HTTP côté client. Le but de HttpClient est d'envoyer et de recevoir des messages HTTP.
Je pense que je n'ai pas besoin d'en dire plus sur l'importance du protocole Http. Par rapport à URLConnection fourni avec le JDK traditionnel, HttpClient a une facilité d'utilisation et une flexibilité accrues (nous discuterons des différences spécifiques dans le futur). n'est pas seulement un moyen pour le client d'envoyer des requêtes HTTP. C'est simple, et cela permet également aux développeurs de tester l'interface (basée sur le protocole HTTP), ce qui améliore l'efficacité du développement et améliore la robustesse du code. Par conséquent, la maîtrise de HttpClient est très importante et obligatoire. Après avoir maîtrisé HttpClient, je pense que la compréhension du protocole Http sera plus approfondie.
1. Introduction
HttpClient est un sous-projet d'Apache Jakarta Common, utilisé pour fournir une boîte à outils de programmation client efficace, à jour et riche en fonctionnalités qui prend en charge le protocole HTTP, et prend en charge la dernière version et les recommandations du protocole HTTP. HttpClient a été utilisé dans de nombreux projets. Par exemple, deux autres projets open source célèbres sur Apache Jakarta, Cactus et HTMLUnit, utilisent tous deux HttpClient.
Adresse de téléchargement : http://hc.apache.org/downloads.cgi
2. Caractéristiques
1. Basé sur le langage Java standard et pur. Implémentation de Http1.0 et Http1.1
2. Implémente toutes les méthodes HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS et TRACE) avec une structure extensible orientée objet.
3. Prend en charge le protocole HTTPS.
4. Établissez une connexion transparente via un proxy HTTP.
5. Utilisez la méthode CONNECT pour établir une connexion https tunnelisée via le proxy HTTP.
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, schéma d'authentification SNPNEGO/Kerberos.
7. Schéma d'authentification personnalisé du plug-in.
8. L'usine de prises portable et fiable facilite l'utilisation de solutions tierces.
9. Le gestionnaire de connexions prend en charge les applications multithread. Prend en charge la définition du nombre maximum de connexions, ainsi que la définition du nombre maximum de connexions pour chaque hôte, et découvre et ferme les connexions expirées.
10. Gérez automatiquement les cookies dans Set-Cookie.
11. Politique de cookies personnalisés du plug-in.
12. Le flux de sortie de Request peut éviter de mettre en mémoire tampon le contenu du flux directement sur le serveur socket.
13. Le flux d'entrée de Response peut lire efficacement le contenu correspondant directement à partir du serveur socket.
14. Utilisez KeepAlive pour maintenir des connexions persistantes dans http1.0 et http1.1.
15. Obtenez directement le code de réponse et les en-têtes envoyés par le serveur.
16. Possibilité de définir le délai d'expiration de la connexion.
17. Prise en charge expérimentale de la mise en cache des réponses http1.1.
18. Le code source est disponible gratuitement sous la licence Apache.
3. Comment utiliser
Il est très simple d'utiliser HttpClient pour envoyer des requêtes et recevoir des réponses. Généralement, les étapes suivantes sont requises.
1. Créez un objet HttpClient.
2. Créez une instance de la méthode de requête et spécifiez l'URL de la requête. Si vous devez envoyer une requête GET, créez un objet HttpGet ; si vous devez envoyer une requête POST, créez un objet HttpPost.
3. Si vous devez envoyer des paramètres de requête, vous pouvez appeler la méthode setParams (HetpParams params) commune à HttpGet et HttpPost pour ajouter des paramètres de requête pour l'objet HttpPost, vous pouvez également appeler la méthode setEntity (entité HttpEntity) pour définir la requête ; paramètres.
4. Appelez execute(HttpUriRequest request) de l'objet HttpClient pour envoyer la requête. Cette méthode renvoie une HttpResponse.
5. Appelez getAllHeaders(), getHeaders(String name) et d'autres méthodes de HttpResponse pour obtenir les en-têtes de réponse du serveur ; appelez la méthode getEntity() de HttpResponse pour obtenir l'objet HttpEntity, qui encapsule le contenu de la réponse du serveur. Le programme peut obtenir le contenu de la réponse du serveur via cet objet.
6. Libérez la connexion. Que la méthode d'exécution réussisse ou non, la connexion doit être libérée
4. Exemples
package com.test ; importer java.io.File ; importer java.io.FileInputStream ; importer java.io.UnsupportedEncodingException ; importer java.security.KeyStore ; sécurité.KeyStoreException ; importer java.security.NoSuchAlgorithmException ; java.security.cert.CertificateException ; importer java.util.ArrayList ; importer java.util.List ; importer javax.net.ssl.SSLContext ; importer org.apache.http.HttpEntity ; org.apache.http.ParseException; importer org.apache.http.client.ClientProtocolException; org.apache.http.client.entity.UrlEncodedFormEntity ; importer org.apache.http.client.methods.CloseableHttpResponse ; importer org.apache.http.client.methods.HttpGet ; ;importer org.apache.http.conn.ssl.SSLConnectionSocketFactory ; importer org.apache.http.conn.ssl.SSLContexts ; importer org.apache.http.conn.ssl.TrustSelfSignedStrategy ; org.apache.http.entity.mime.MultipartEntityBuilder ; org.apache.http.entity.mime.content.FileBody ; importer org.apache.http.entity.mime.content.StringBody ; importer org.apache.http.impl.client.CloseableHttpClient ; .client.HttpClients ; importer org.apache.http.message.BasicNameValuePair ; org.apache.http.util.EntityUtils; import org.junit.Test; public class HttpClientTest { @Test public void jUnitTest() { get( } /** * HttpClient se connecte à SSL */ public void ssl() { CloseableHttpClient httpclient = null ; essayez { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new File("d://tomcat.keystore")); try { // Charger keyStore d://tomcat.keystore trustStore.load(instream , "123456".toCharArray()); } catch (CertificateException e) { e.printStackTrace( } enfin { try { instream.close(); } catch (Exception ignore) { } } // Faites confiance à votre propre autorité de certification et à tous les certificats auto-signés SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build() ; // Autoriser uniquement l'utilisation du protocole TLSv1 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); // Créer une requête http (mode get) HttpGet httpget = nouveau HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("exécution de la demande" + httpget.getRequestLine()); { Entité HttpEntity = réponse.getEntity(); System.out.println("--------------------------------- -------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("Longueur du contenu de la réponse : " +entity.getContentLength()); (entité)); EntityUtils.consume(entité); } } enfin { réponse.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(); } enfin { if (httpclient != null) { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * Soumettre le formulaire en mode publication (simuler la demande de connexion de l'utilisateur) */ public void postForm() { // Crée une instance httpClient par défaut CloseableHttpClient httpclient = HttpClients.createDefault(); // Crée httppost HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // Créer une file d'attente de paramètres List<namevaluepair> formparams = new ArrayList<namevaluepair>(); , "admin")); formparams.add(new BasicNameValuePair("mot de passe", "123456")); UrlEncodedFormEntity uefEntity ; try { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); System.out.println("exécution de la requête " + httppost.getURI()); (httppost); essayez { HttpEntity entité = réponse.getEntity(); if (entité != null) { System.out.println("-------------------------- ------------"); System.out.println("Contenu de la réponse : " + EntityUtils.toString(entity, "UTF-8")); System.out.println("-- ------------------------------------"); } } enfin { réponse.close(); } } attraper (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace( } enfin { // Ferme la connexion et libère les ressources try { httpclient .close(); } catch (IOException e) { e.printStackTrace(); } } } /** * Envoyer une demande de publication pour accéder à l'application locale et renvoyer différents résultats en fonction des différents paramètres passés */ public void post() { // Créer une instance httpClient par défaut httpclient = HttpClients.createDefault(); // Créer un httppost HttpPost httppost. = new HttpPost(" http://localhost:8080/myDemo/Ajax/serivceJ.action"); Créer une file d'attente de paramètres List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("type", "house")); "); httppost.setEntity(uefEntity); System.out.println("exécution de la demande" + httppost.getURI()); CloseableHttpResponse réponse = httpclient.execute(httppost); try { HttpEntity entité = réponse.getEntity(); .println("-----------------------------------------------"); .out.println ("Contenu de la réponse : " + EntityUtils.toString(entité, "UTF-8")); System.out.println("----------------------------- ---------"); } } enfin { réponse.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } attraper (IOException e) { e.printStackTrace(); } enfin { // Ferme la connexion et libère les ressources try { httpclient.close(); } catch (IOException e) { e.printStackTrace( } } } /** * Envoyer une requête get* / public void get() { CloseableHttpClient httpclient = HttpClients.createDefault(); try { // Créer httpget httpget = new. HttpGet("http://www.baidu.com/"); System.out.println("exécution de la requête " + httpget.getURI()); // Exécuter la réponse CloseableHttpResponse = httpclient.execute(httpget); try { // Récupère l'entité de réponse HttpEntity Entity = Response.getEntity(); System.out.println("---------------- ----------"); // Imprimer l'état de la réponse System.out.println(response.getStatusLine()); if (entity != null) { // Imprimer la longueur du contenu de la réponse System.out.println("Longueur du contenu de la réponse : " +entity.getContentLength()); //Imprimer le contenu de la réponse System.out.println("Contenu de la réponse : " + EntityUtils.toString(entity)); System.out.println("----------------------------------------"); } enfin { réponse .close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace( } catch (IOException e) { e.printStackTrace( } enfin { // Ferme la connexion et libère les ressources try { httpclient.close( } catch (IOException); e) { e.printStackTrace(); } } } /** * Télécharger des fichiers*/ public void upload() { CloseableHttpClient httpclient = HttpClients.createDefault(); 8080/myDemo/Ajax/serivceFile.action"); FileBody bin = nouveau FileBody(nouveau File("F://image//sendpix0.jpg")); StringBody comment = new StringBody("Un fichier binaire quelconque", ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin); ", bin).addPart("comment", comment).build(); httppost.setEntity(reqEntity); System.out.println("exécution de la requête " + httppost.getRequestLine()); Réponse CloseableHttpResponse = httpclient.execute(httppost); try { System.out.println("------------- -----------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = réponse. getEntity( ); if (resEntité != null) { System.out.println("Longueur du contenu de la réponse : " + resEntity.getContentLength()); } EntityUtils.consume(resEntity); } enfin { réponse.close( } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace( } enfin { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } }</namevaluepair></namevaluepair></namevaluepair></namevaluepair>
Cet exemple utilise la dernière version de HttpClient4.3. Cette version est assez différente du style d'écriture de code précédent, veuillez donc y prêter plus d'attention.
D'accord, ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il vous plaira.