Hinweis: Der folgende Code basiert auf httpclient4.5.2.
Es ist eine einfachere Aufgabe, das Get -Request -Crawling von Webseiten mithilfe von Javas HTTPClient zu implementieren:
public static String get (String url) {CloSeableableHttPesponsponsponse = null; BufferedReader in = null; String result = ""; try {clodleableHttpclientHttppclient = httpclients.CreateFault (); HttpGethttpget = new httpget (URL); response = httppclient.execute (httpget); in = neuer BufferedReader (neuer InputStreamReader (response.getEntity (). getContent ())); StringBuffersb = new StringBuffer (""); String line = ""; String nl = system.getProperty ("line.separator"); while ((line = in.readline ())! = null) {sb.append (Zeile + nl); } in.close (); result = sb.toString (); } catch (ioException e) {e.printstacktrace (); } endlich {try {if (null! = Antwort) Antwort.CLOSE (); } catch (ioException e) {e.printstacktrace (); }} Rückgabeergebnis; }Die obige Methode ist auch nützlich, wenn die Ausführung von GET-Anfragen mit Multi-Threaded ausgeführt wird. Diese Multi-Thread-Anfrage basiert jedoch auf der Erstellung einer HTTPClient-Instanz jedes Mal, wenn die GET-Methode aufgerufen wird. Jede HTTPClient -Instanz wird einmal recycelt. Dies ist offensichtlich keine optimale Implementierung.
HTTPCLIENT bietet eine Multi-Thread-Anforderungslösung und Sie können das offizielle Dokument "Pooling Connection Manager" anzeigen. Multi-Thread-Anfragen von HTTPClient Implementierung werden basierend auf dem integrierten Verbindungspool implementiert, der über eine Schlüsselklasse verfügt, nämlich PoolinghttpclientConnectionManager, die für die Verwaltung des HTTPClient-Verbindungspools verantwortlich ist. In PoolinghttpclientConnectionManager sind zwei wichtige Methoden verfügbar: setMaxtotal und setDefaultMaxPerRoute. SetMaxtotal Legt die maximale Anzahl von Verbindungen zum Verbindungspool fest und setDefaultMaxperRoute legt die Standardnummer der Verbindungen auf jeder Route fest. Es gibt auch eine Methode SetMaxperRoute - Stellen Sie die maximale Anzahl von Verbindungen für eine bestimmte Site separat fest:
Httphosthost = new httphost ("locahost", 80); CM.SetMaxperRoute (New HttProute (Host), 50);Unsere Implementierung von GET -Anforderungen ist gemäß der Dokumentation leicht angepasst:
Paket com.zhyea.robin; import org.apache.http.client.methods.cloSeableHttPesponse; import org.apache.http.client.methods.httpget; org.apache.http.impl.conn.poolinghttpclientConnectionManager; Import Java.io.BufferedReader; Import Java.io.ioxception; Import Java.io.inputStreamReader; public class httputil {private static CloseableHttpclientHttpclient; static {poolinghttpclientConnectionManAGercm = new PoolinghttpclientConnectionManager (); CM.SetMaxtotal (200); CM.SetDefaultMaxperRoute (20); CM.SetDefaultMaxperRoute (50); httpclient = httpclients.custom (). setConnectionManager (cm) .build (); } public static String get (String url) {clodableableHttpesponPonse = null; BufferedReaderin = null; String result = ""; try {httpGethttpget = new httpget (url); response = httpclient.execute (httpget); in = neuer BufferedReader (neuer InputStreamReader (response.getEntity (). getContent ())); StringBuffersb = new StringBuffer (""); String line = ""; String nl = system.getProperty ("line.separator"); while ((line = in.readline ())! = null) {sb.append (Zeile + nl); } in.close (); result = sb.toString (); } catch (ioException e) {e.printstacktrace (); } endlich {try {if (null! = Antwort) Antwort.CLOSE (); } catch (ioException e) {e.printstacktrace (); }} Rückgabeergebnis; } public static void main (String [] args) {System.out.println (get ("https://www.baidu.com/"); }}Das war's. Aber für mich bevorzuge ich die fließende Implementierung von HTTP Pclient. Beispielsweise kann die von uns implementierte HTTP -GET -Anfrage einfach so implementiert werden:
Paket com.zhyea.robin; import org.apache.http.client.fluent.request; import Java.io.ioException; public class httputil {public static String get (String url) {String result = ""; try {result = request.get (url) .connectTimeout (1000) .sockettimeout (1000) .execute (). returnContent (). Asstring (); } catch (ioException e) {e.printstacktrace (); } Rückgabeergebnis; } public static void main (String [] args) {System.out.println (get ("https://www.baidu.com/"); }}Alles, was wir tun müssen, ist die vorherige HTTPClient-Abhängigkeit durch die Abhängigkeit von Fluent-HC zu ersetzen:
<Depopenty> <gruppe> org.apache.httpcomponents </Groupid> <artifactId> fluent-hc </artifactId> <version> 4.5.2 </Version> </abhängig>
Und diese fließende Implementierung wird natürlich unter Verwendung von PoolinghttpclientConnectionManager erreicht. Die Werte von Maxtotal und DefaultmaxPerRoute, die sie festlegen, betragen 200 bzw. 100:
Connmgr = new PoolinghttpclientConnectionManager (SFR); Connmgr.setDefaultmaxPerRoute (100); Connmgr.setmaxtotal (200);
Das einzige, was die Menschen verärgert fühlen, ist, dass der Testamentsvollstrecker keine Möglichkeit bietet, diese beiden Werte anzupassen. Aber das ist genug. Wenn es wirklich nicht funktioniert, können Sie auch in Betracht ziehen, die Executor -Methode neu zu schreiben und dann den Executor direkt zur Ausführung der GET -Anforderung verwenden:
Executor.NewinStance (). Execute (request.get (url)) .returnContent (). Assstring ();
Das ist alles!