HttpClient ist eine clientseitige HTTP-Kommunikationsimplementierungsbibliothek. Das Ziel von HttpClient ist das Senden und Empfangen von HTTP-Nachrichten.
Ich glaube, ich muss nicht mehr über die Bedeutung des Http-Protokolls sagen. Im Vergleich zur URLConnection, die mit dem herkömmlichen JDK geliefert wird, ist HttpClient benutzerfreundlicher und flexibler (wir werden die spezifischen Unterschiede später besprechen). Dies ist nicht nur eine einfache Möglichkeit für den Client, sondern erleichtert Entwicklern auch das Testen der Schnittstelle (basierend auf dem HTTP-Protokoll), was die Effizienz der Entwicklung und die Robustheit des Codes verbessert. Daher sind Kenntnisse in HttpClient sehr wichtig und obligatorisch. Nach der Beherrschung von HttpClient glaube ich, dass das Verständnis des Http-Protokolls tiefer sein wird.
1. Einführung
HttpClient ist ein Unterprojekt von Apache Jakarta Common, das zur Bereitstellung eines effizienten, aktuellen und funktionsreichen Client-Programmier-Toolkits dient, das das HTTP-Protokoll unterstützt und die neueste Version und Empfehlungen des HTTP-Protokolls unterstützt. HttpClient wurde in vielen Projekten verwendet. Beispielsweise verwenden zwei andere bekannte Open-Source-Projekte auf Apache Jakarta, Cactus und HTMLUnit, beide HttpClient.
Download-Adresse: http://hc.apache.org/downloads.cgi
2. Eigenschaften
1. Basierend auf Standard- und reiner Java-Sprache. Http1.0 und Http1.1 implementiert
2. Implementiert alle HTTP-Methoden (GET, POST, PUT, DELETE, HEAD, OPTIONS und TRACE) mit einer erweiterbaren objektorientierten Struktur.
3. Unterstützt das HTTPS-Protokoll.
4. Stellen Sie eine transparente Verbindung über einen HTTP-Proxy her.
5. Verwenden Sie die CONNECT-Methode, um eine getunnelte https-Verbindung über den HTTP-Proxy herzustellen.
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos-Authentifizierungsschema.
7. Benutzerdefiniertes Plug-in-Authentifizierungsschema.
8. Die tragbare und zuverlässige Steckdosenfabrik erleichtert die Verwendung von Lösungen von Drittanbietern.
9. Der Verbindungsmanager unterstützt Multithread-Anwendungen. Unterstützt das Festlegen der maximalen Anzahl von Verbindungen sowie das Festlegen der maximalen Anzahl von Verbindungen für jeden Host und erkennt und schließt abgelaufene Verbindungen.
10. Cookies in Set-Cookie automatisch verarbeiten.
11. Benutzerdefinierte Cookie-Richtlinie für Plug-ins.
12. Der Ausgabestream von Request kann vermeiden, dass der Inhalt im Stream direkt auf dem Socket-Server gepuffert wird.
13. Der Eingabestrom von Response kann den entsprechenden Inhalt effektiv direkt vom Socket-Server lesen.
14. Verwenden Sie KeepAlive, um dauerhafte Verbindungen in http1.0 und http1.1 aufrechtzuerhalten.
15. Rufen Sie den vom Server gesendeten Antwortcode und die Header direkt ab.
16. Möglichkeit, das Verbindungszeitlimit festzulegen.
17. Experimentelle Unterstützung für das http1.1-Antwort-Caching.
18. Der Quellcode ist unter der Apache-Lizenz frei verfügbar.
3. Anwendung
Es ist sehr einfach, HttpClient zum Senden von Anforderungen und zum Empfangen von Antworten zu verwenden. Im Allgemeinen sind die folgenden Schritte erforderlich.
1. Erstellen Sie ein HttpClient-Objekt.
2. Erstellen Sie eine Instanz der Anforderungsmethode und geben Sie die Anforderungs-URL an. Wenn Sie eine GET-Anfrage senden müssen, erstellen Sie ein HttpGet-Objekt. Wenn Sie eine POST-Anfrage senden müssen, erstellen Sie ein HttpPost-Objekt.
3. Wenn Sie Anforderungsparameter senden müssen, können Sie die für HttpGet und HttpPost gemeinsame Methode setParams (HetpParams params) aufrufen, um Anforderungsparameter hinzuzufügen. Für das HttpPost-Objekt können Sie auch die Methode setEntity (HttpEntity-Entität) aufrufen, um die Anforderung festzulegen Parameter.
4. Rufen Sie „execute(HttpUriRequest request)“ des HttpClient-Objekts auf, um die Anforderung zu senden. Diese Methode gibt eine HttpResponse zurück.
5. Rufen Sie getAllHeaders(), getHeaders(String name) und andere Methoden von HttpResponse auf, um die Antwortheader des Servers abzurufen. Rufen Sie die getEntity()-Methode von HttpResponse auf, um das HttpEntity-Objekt abzurufen, das den Antwortinhalt des Servers umschließt. Über dieses Objekt kann das Programm den Antwortinhalt des Servers abrufen.
6. Lösen Sie die Verbindung. Unabhängig davon, ob die Ausführungsmethode erfolgreich ist oder nicht, muss die Verbindung freigegeben werden
4. Beispiele
package com.test; import java.io.FileInputStream; import java.io.UnsupportedEncodingException; import java.security.KeyStore; security.KeyStoreException; import java.security.NoSuchAlgorithmException; java.security.cert.CertificateException; import java.net.ssl.SSLContext; import org.apache.http.NameValuePair; org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost ;Import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.ssl.SSLContexts; import org.apache.http.entity.ContentType; org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; .client.HttpClients; import org.apache.http.message.BasicNameValuePair; org.apache.http.util.EntityUtils; import org.junit.Test; public class HttpClientTest { @Test public void jUnitTest() { get(); /** * HttpClient stellt eine Verbindung zu SSL her */ public void ssl() { CloseableHttpClient httpclient = null; try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new File("d://tomcat.keystore")); try { // keyStore laden d://tomcat.keystore trustStore.load(instream , „123456“.toCharArray()); { instream.close(); } Catch (Ausnahme ignorieren) { } } // Vertraue deiner eigenen Zertifizierungsstelle und allen selbstsignierten Zertifikaten SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build() ; // Nur die Verwendung des TLSv1-Protokolls zulassen SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); // HTTP-Anfrage erstellen (Get-Modus) HttpGet httpget = neu HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("executing request" + httpget.getRequestLine()); CloseableHttpResponse Response = httpclient.execute(httpget); { HttpEntity-Entity = Response.getEntity(); System.out.println("--------------------------------- -------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); (Entity)); EntityUtils.consume(Entity); (ParseException e) { e.printStackTrace(); } Catch (IOException e) { e.printStackTrace(); } Catch (KeyManagementException e) { e.printStackTrace(); } Catch (KeyStoreException e) { e.printStackTrace(); } Finally { if (httpclient != null) { try { httpclient.close(); } Catch (IOException e) { e.printStackTrace(); } } } /** * Formular im Post-Modus senden (Benutzeranmeldeanfrage simulieren) */ public void postForm() { // Eine Standard-httpClient-Instanz erstellen. CloseableHttpClient httpclient = HttpClients.createDefault(); // httppost erstellen HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // Parameterwarteschlange erstellen List<namevaluepair>(); formparams.add(new BasicNameValuePair("username" , "admin")); formparams.add(new BasicNameValuePair("password", "123456")); UrlEncodedFormEntity; try { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); System.out.println("executing request" + httppost.getURI()); (httppost); versuchen Sie es mit { HttpEntity entity = Response.getEntity(); if (entity != null) { System.out.println("-------------------------- ------------"); System.out.println("Antwortinhalt: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("-- ------------------------------------"); } } Finally { Response.close(); } } fangen (ClientProtocolException e) { e.printStackTrace(); } Catch (UnsupportedEncodingException e1) { e1.printStackTrace(); httpclient .close(); } Catch (IOException e) { e.printStackTrace(); Senden Sie eine Post-Anfrage, um auf die lokale Anwendung zuzugreifen und je nach übergebenen Parametern unterschiedliche Ergebnisse zurückzugeben. */ public void post() { // Erstellen Sie eine Standardinstanz von httpClient httpclient = HttpClients.createDefault(); = new HttpPost(" http://localhost:8080/myDemo/Ajax/serivceJ.action"); Parameterwarteschlange erstellen List<namevaluepair>(); formparams.add(new BasicNameValuePair("type", "house")); try { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8 "); httppost.setEntity(uefEntity); System.out.println("executing request" + httppost.getURI()); CloseableHttpResponse Response = httpclient.execute(httppost); try { HttpEntity = Response.getEntity(); if (entity != null) { System.out .println("--------------------------"); System .out.println ("Antwortinhalt: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("-------------- ---------"); } } Finally { Response.close(); } } Catch (ClientProtocolException e) { e.printStackTrace(); } Catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } Catch (IOException e) { e.printStackTrace(); } Finally { // Verbindung schließen und Ressourcen freigeben try { httpclient.close(); } Catch (IOException e) { e.printStackTrace() } /** * Eine Get-Anfrage senden* / public void get() { CloseableHttpClient httpclient = HttpClients.createDefault(); try { // HTTPget erstellen = new HttpGet("http://www.baidu.com/"); System.out.println("executing request " + httpget.getURI()); // Get request ausführen = httpclient.execute(httpget); try { // Antwortentität abrufen HttpEntity entity = Response.getEntity(); System.out.println("----------- ----------"); // Antwortstatus drucken System.out.println(response.getStatusLine()); if (entity != null) { // Antwortinhaltslänge drucken System.out.println("Antwortinhaltslänge: " + entity.getContentLength()); //Den Antwortinhalt drucken System.out.println("Antwortinhalt: " + EntityUtils.toString(entity) } System.out.println("--------------------------"); } Finally { Antwort .close(); } Catch (ClientProtocolException e) { e.printStackTrace(); } Catch (ParseException e) { e.printStackTrace(); schließlich { // Verbindung schließen und Ressourcen freigeben try { httpclient.close(); } Catch (IOException e) { e.printStackTrace(); } } } /** * Dateien hochladen*/ public void upload() { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost("http://localhost: 8080/myDemo/Ajax/serivceFile.action"); FileBody bin = new FileBody(new File("F://image//sendpix0.jpg")); StringBody comment = new StringBody("Eine Art Binärdatei", ContentType.TEXT_PLAIN); ", bin).addPart("comment", comment).build(); httppost.setEntity(reqEntity); System.out.println("executing request " + httppost.getRequestLine()); CloseableHttpResponse Response = httpclient.execute(httppost); try { System.out.println("------------- -----------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = Antwort. getEntity( ); if (resEntity != null) { System.out.println("Antwortinhaltslänge: " + resEntity.getContentLength()); e.printStackTrace(); } Catch (IOException e) { e.printStackTrace( } Finally { try {); httpclient.close(); } Catch (IOException e) { e.printStackTrace(); } }</namevaluepair></namevaluepair></namevaluepair></namevaluepair>
In diesem Beispiel wird die neueste Version von HttpClient4.3 verwendet. Diese Version unterscheidet sich erheblich vom vorherigen Code-Schreibstil. Achten Sie daher bitte genauer darauf.
Okay, das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, er gefällt Ihnen.