Nota: El siguiente código se basa en httpclient4.5.2.
Es una tarea más fácil implementar la solicitud GET rastreando las páginas web utilizando HTTPClient de Java:
public static String get (String Url) {cierreHtttPponseSponse = null; BufferedReader en = NULL; Resultado de cadena = ""; Pruebe {cierrehttpclienthttppclient = httpclients.createDefault (); Httpgethttpget = new httpget (url); respuesta = httppclient.execute (httpget); in = new BufferedReader (new InputStreamReader (Response.GetEntity (). GetContent ())); StringBuffersB = new StringBuffer (""); Línea de cadena = ""; Cadena nl = system.getProperty ("line.separator"); while ((line = in.readline ())! = null) {sb.append (línea + nl); } in.close (); resultado = sb.ToString (); } catch (ioException e) {E.PrintStackTrace (); } finalmente {try {if (null! = respuesta) respuesta.close (); } catch (ioException e) {E.PrintStackTrace (); }} Resultado de retorno; }El método anterior también es útil cuando la ejecución multiproceso de las solicitudes GET. Sin embargo, esta solicitud de múltiples subprocesos se basa en la creación de una instancia de HTTPClient cada vez que se llama al método GET. Cada instancia de httpclient se recicla una vez. Obviamente, esta no es una implementación óptima.
HttpClient proporciona una solución de solicitud de múltiples subprocesos, y puede ver el documento oficial "Administrador de conexión de agrupación". Las solicitudes multiproceso de implementación httpClient se implementan en función del grupo de conexión incorporado, que tiene una clase clave, a saber, PoolinghttpClientConnectionManager, que es responsable de administrar el grupo de conexión HTTPClient. Hay dos métodos clave disponibles en PoolinghttpClientConnectionManager: SetMaxtotal y SetDefaultMaxperRoute. SetMaTtotal establece el número máximo de conexiones al grupo de conexión y SetDefaultMaxperRoute establece el número predeterminado de conexiones en cada ruta. También hay un método setMaxperRoute: establezca el número máximo de conexiones para un determinado sitio por separado, como este:
HttphospThost = new httphost ("locahost", 80); cM.SetMaxperRoute (nuevo httproute (host), 50);Nuestra implementación de solicitud GET se ajusta ligeramente de acuerdo con la documentación:
paquete com.zhyea.robin; importar org.apache.http.client.methods.closablehtttpesponse; import org.apache.http.client.methods.httpget; importar org.apache.http.impl.client.closableHttpClient; import org.apache.http.impl.conn.poolinghttpClientConnectionManager; import java.io.bufferedReader; import java.io.ioexception; import java.io.inputstreamreader; clase pública httputil {private staticseablehttpclienthttpclient; 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) {cierreHtttPponsponse = null; BufferedReaderin = nulo; Resultado de cadena = ""; intente {httpgethttpget = new httpget (url); respuesta = httpClient.Execute (httpget); in = new BufferedReader (new InputStreamReader (Response.GetEntity (). GetContent ())); StringBuffersB = new StringBuffer (""); Línea de cadena = ""; Cadena nl = system.getProperty ("line.separator"); while ((line = in.readline ())! = null) {sb.append (línea + nl); } in.close (); resultado = sb.ToString (); } catch (ioException e) {E.PrintStackTrace (); } finalmente {try {if (null! = respuesta) respuesta.close (); } catch (ioException e) {E.PrintStackTrace (); }} Resultado de retorno; } public static void main (string [] args) {System.out.println (get ("https://www.baidu.com/")); }}Eso es todo. Pero para mí, prefiero la implementación fluida de HTTP PClient. Por ejemplo, la solicitud HTTP Get que acabamos de implementar se puede implementar simplemente así:
paquete com.zhyea.robin; importar org.apache.http.client.fluent.request; import java.io.ioException; clase pública httputil {public static string get (string url) {string dult = ""; Pruebe {resultado = request.get (url) .connecttimeout (1000) .socketTimeout (1000) .execute (). returnContent (). astring (); } catch (ioException e) {E.PrintStackTrace (); } resultado de retorno; } public static void main (string [] args) {System.out.println (get ("https://www.baidu.com/")); }}Todo lo que tenemos que hacer es reemplazar la dependencia anterior de HTTPClient con dependencia de HC con fluidez:
<Spendency> <ProupId> org.apache.httpComponents </groupid> <artifactid> fluent-hc </artifactid> <versión> 4.5.2 </versión> </pendency>
Y esta implementación fluida se realiza naturalmente utilizando PoolinghttpClientConnectionManager. Los valores de Maxtotal y DefaultMaxperRoute que establece son 200 y 100 respectivamente:
Connmgr = new PoolinghttpClientConnectionManager (SFR); Connmgr.setDefaultMaxperRoute (100); Connmgr.setMaxTotal (200);
Lo único que hace que las personas se sientan molestas es que el ejecutor no proporciona una forma de ajustar estos dos valores. Pero esto es suficiente. Si realmente no funciona, también puede considerar reescribir el método del Ejecutor y luego usar directamente el Ejecutor para ejecutar la solicitud GET:
Ejecutor.newinStance (). Execute (request.get (url)) .returnContent (). Astring ();
¡eso es todo!