2012-03-21 24 views
18

Estoy usando la biblioteca httpclient común de apache. ¿Es posible hacer una solicitud HTTP sobre un proxy? Más específico, necesito usar la lista de proxy para solicitudes POST multiproceso (en este momento estoy probando con solicitudes GET de subproceso único).HTTPclient común y proxy

He intentado utilizar:

 httpclient.getHostConfiguration().setProxy("67.177.104.230", 58720); 

recibo errores con ese código:

21.03.2012. 20:49:17 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry 
INFO: I/O exception (java.net.ConnectException) caught when processing request: Connection refused: connect 
21.03.2012. 20:49:17 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry 
INFO: Retrying request 
21.03.2012. 20:49:19 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry 
INFO: I/O exception (java.net.ConnectException) caught when processing request: Connection refused: connect 
21.03.2012. 20:49:19 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry 
INFO: Retrying request 
21.03.2012. 20:49:21 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry 
INFO: I/O exception (java.net.ConnectException) caught when processing request: Connection refused: connect 
21.03.2012. 20:49:21 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry 
INFO: Retrying request 
org.apache.commons.httpclient.ProtocolException: The server xxxxx failed to respond with a valid HTTP response 
    at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1846) 
    at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1590) 
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:995) 
    at org.apache.commons.httpclient.ConnectMethod.execute(ConnectMethod.java:144) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeConnect(HttpMethodDirector.java:495) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:390) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170) 
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396) 
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324) 
    at test.main(test.java:42) 

Cuando quito esa línea, todo funciona muy bien como se esperaba.

+1

De hecho es posible. En su excepción, ¿qué host es el 'xxxxx' redactado? ¿Tu proxy o el destino? ¿Por qué tienes tantas conexiones rechazadas? ¿Su proxy realmente funciona correctamente? –

+2

Ha configurado un proxy HTTP, no un proxy SOCKS. SOFTWARE no es compatible con HttpClient 3. Es posible que pueda utilizar las propiedades del sistema 'socksProxyHost' y 'socksProxyPort'. O HttpComponents HttpClient 4 puede admitir proxies SOCKS. –

Respuesta

31

Para 4.1.x httpclient puede configurar el proxy como esto (tomado de this example):

HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http"); 

    DefaultHttpClient httpclient = new DefaultHttpClient(); 
    try { 
     httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 

     HttpHost target = new HttpHost("issues.apache.org", 443, "https"); 
     HttpGet req = new HttpGet("/"); 

     System.out.println("executing request to " + target + " via " + proxy); 
     HttpResponse rsp = httpclient.execute(target, req); 
     ... 
    } finally { 
     // When HttpClient instance is no longer needed, 
     // shut down the connection manager to ensure 
     // immediate deallocation of all system resources 
     httpclient.getConnectionManager().shutdown(); 
    } 
+0

No uso nuevos componentes HTTP, estoy usando commons httpclient. Tal vez debería transferir ... – dario111cro

+0

Llego un poco tarde a la fiesta, pero esto funcionó como un encanto para mi configuración de desarrollo interno. Muchas gracias y tienen un voto positivo. – Jas

+0

esto no funcionará en socks4/5 proxy – tribbloid

0

He tenido un problema similar con la versión de cliente HTTP 4. no podía conectar con el servidor porque de un error de proxy SOCKS y lo solucioné usando la siguiente configuración:

client.getParams(). setParameter ("socksProxyHost", proxyHost); client.getParams(). SetParameter ("socksProxyPort", proxyPort);

5

A partir de Apache HTTPComponents 4.3.x La clase HttpClientBuilder establece los valores predeterminados de proxy de las propiedades del sistema http.proxyHost y http.proxyPort o bien puede anularlos utilizando el método setProxy.

9

Aquí es cómo hacer eso con la última versión de HTTPClient (4.3.4)

CloseableHttpClient httpclient = HttpClients.createDefault(); 
    try { 
     HttpHost target = new HttpHost("localhost", 443, "https"); 
     HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http"); 

     RequestConfig config = RequestConfig.custom() 
       .setProxy(proxy) 
       .build(); 
     HttpGet request = new HttpGet("/"); 
     request.setConfig(config); 

     System.out.println("Executing request " + request.getRequestLine() + " to " + target + " via " + proxy); 

     CloseableHttpResponse response = httpclient.execute(target, request); 
     try { 
      System.out.println("----------------------------------------"); 
      System.out.println(response.getStatusLine()); 
      EntityUtils.consume(response.getEntity()); 
     } finally { 
      response.close(); 
     } 
    } finally { 
     httpclient.close(); 
    } 
+0

Hola Dónde configurar las credenciales para el usuario/pase Proxy. Lo siento, no estoy seguro de esto. – Anand

+0

Puede echar un vistazo aquí http://stackoverflow.com/questions/19252946/apache-http-client-4-3-credentials-per-request –

+0

¿Cómo puedo utilizar 'CloseableHttpClient httpclient = HttpClients.createDefault();' de Tomcat? Tengo un servlet que llama a la función estática que supone enviar una solicitud http a otro servidor –

7

Aunque esta pregunta es muy antiguo, pero veo todavía no hay respuesta exacta. Trataré de responder la pregunta aquí.

Creo que la pregunta en breve aquí es cómo establecer la configuración del proxy para los recursos comunes de Apache HttpClient (org.apache.commons.httpclient.HttpClient).

siguiente fragmento de código debería funcionar:

HttpClient client = new HttpClient(); 
HostConfiguration hostConfiguration = client.getHostConfiguration(); 
hostConfiguration.setProxy("localhost", 8080); 
client.setHostConfiguration(hostConfiguration); 
2

Así es como he resuelto este problema para la edad (< 4.3) HttpClient (que no puedo actualizar), usando la respuesta de Santosh Singh (quien me dio una +1):

HttpClient httpclient = new HttpClient(); 
if (System.getProperty("http.proxyHost") != null) { 
    try { 
    HostConfiguration hostConfiguration = httpclient.getHostConfiguration(); 
    hostConfiguration.setProxy(System.getProperty("http.proxyHost"), Integer.parseInt(System.getProperty("http.proxyPort"))); 
    httpclient.setHostConfiguration(hostConfiguration); 
    this.getLogger().warn("USING PROXY: "+httpclient.getHostConfiguration().getProxyHost()); 
    } catch (Exception e) { 
    throw new ProcessingException("Cannot set proxy!", e); 
    } 
}