Nota: O código a seguir é baseado no httpclient4.5.2.
É uma tarefa mais fácil implementar a solicitação de solicitação de páginas da web usando o httpclient da Java:
public static string get (string url) {closableHttProSponsSponse = null; BufferredReader in = null; String result = ""; tente {ClosableHttpClientHttppClient = httpClients.createFault (); Httpgethttpget = new httpget (url); resposta = httppclient.execute (httpget); in = new BufferredReader (new InputStreamReader (Response.getEntity (). getContent ())); StringBuffersB = new StringBuffer (""); String line = ""; String nl = System.getProperty ("line.separator"); while ((line = in.readline ())! = null) {sb.append (linha + nl); } in.close (); resultado = sb.toString (); } catch (ioexception e) {e.printStackTrace (); } finalmente {tente {if (null! = Response) Response.Close (); } catch (ioexception e) {e.printStackTrace (); }} Retornar resultado; }O método acima também é útil quando a execução multithread das solicitações GET. No entanto, essa solicitação com vários threaded é baseada na criação de uma instância httpclient toda vez que o método GET for chamado. Cada instância httpclient é reciclada uma vez. Obviamente, isso não é uma implementação ideal.
O HTTPClient fornece uma solução de solicitação multithread e você pode visualizar o documento oficial "Pooling Connection Manager". As solicitações multidreadas de implementação de HTTPClient são implementadas com base no pool de conexões interno, que possui uma classe chave, como PoolingHttpClientConnectionManager, responsável pelo gerenciamento do pool de conexão HTTPClient. Existem dois métodos principais disponíveis no PoolingHttpClientConnectionManager: Setmaxtotal e SetDefaultMaxPerRoute. O setmaxtotal define o número máximo de conexões com o pool de conexões e o setDefaultMaxPerRoute define o número padrão de conexões em cada rota. Há também um método setMaxPerRoute - Defina o número máximo de conexões para um determinado site separadamente, assim:
HttphosThost = novo httphot ("LocaHost", 80); CM.SetMaxPerRoute (New HttProute (host), 50);Nossa implementação de solicitação GET é ligeiramente ajustada de acordo com a documentação:
pacote com.zhyea.robin; import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.conn.poolinghttpclientConnectionManager; importar java.io.bufferedReader; importar java.io.ioException; importar java.io.inputStreamReader; classe pública httputil {private static fechandoHttpClientHttpClient; 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) {closablehttproSponsponse = null; BufferredReaderin = NULL; String result = ""; tente {httpgethttpget = new httpget (url); resposta = httpclient.execute (httpget); in = new BufferredReader (new InputStreamReader (Response.getEntity (). getContent ())); StringBuffersB = new StringBuffer (""); String line = ""; String nl = System.getProperty ("line.separator"); while ((line = in.readline ())! = null) {sb.append (linha + nl); } in.close (); resultado = sb.toString (); } catch (ioexception e) {e.printStackTrace (); } finalmente {tente {if (null! = Response) Response.Close (); } catch (ioexception e) {e.printStackTrace (); }} Retornar resultado; } public static void main (string [] args) {System.out.println (get ("https://www.baidu.com/")); }}É isso. Mas para mim, prefiro a implementação fluente do HTTP PCLIENT. Por exemplo, a solicitação HTTP GET que acabamos de implementar pode ser implementada simplesmente assim:
pacote com.zhyea.robin; importar org.apache.http.client.fluent.request; importar java.io.ioException; classe pública httputil {public static string get (string url) {string resultado = ""; tente {resultado = request.get (url) .connectTimeout (1000) .sockettimeout (1000) .execute (). returnContent (). Asstring (); } catch (ioexception e) {e.printStackTrace (); } resultado de retorno; } public static void main (string [] args) {System.out.println (get ("https://www.baidu.com/")); }}Tudo o que precisamos fazer é substituir a dependência anterior HTTPClient pela dependência fluente-hc:
<Depencency> <roupidId> org.apache.httpcomponents </groupiD> <TRAFACTID> fluent-hc </stifactId> <versão> 4.5.2 </versão </dependency>
E essa implementação fluente é realizada naturalmente usando o PoolingHttpClientConnectionManager. Os valores de Maxtotal e DefaultMaxPerroute que ele definir são 200 e 100, respectivamente:
Connmgr = new PoolingHttpClientConnectionManager (SFR); Connmgr.setDefaultMaxPerRoute (100); Connmgr.setmaxtotal (200);
A única coisa que faz as pessoas se sentirem chateadas é que o executor não fornece uma maneira de ajustar esses dois valores. Mas isso é suficiente. Se realmente não funcionar, você também pode considerar reescrever o método do executor e depois usar diretamente o executor para executar a solicitação GET:
Executor.newInstance (). Execute (request.get (url)) .returnContent (). Asstring ();
isso é tudo!