2012-03-21 24 views
18

Używam wspólnej biblioteki httpclienta Apache. Czy można przesłać żądanie HTTP przez serwer proxy? Mówiąc dokładniej, potrzebuję użyć listy proxy dla wielowątkowych żądań POST (obecnie testuję z pojedynczymi żądaniami GET).Typowy klient HTTP i proxy

Próbowałem użyć:

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

pojawiają się błędy z tym kodem:

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) 

Kiedy usunąć tę linię, wszystko działa dobrze, jak oczekiwano.

+1

Jest to rzeczywiście możliwe. W twoim wyjątku, który host jest redaktorem 'xxxxx'? Twój serwer proxy lub miejsce docelowe? Dlaczego odmówiono tylu połączeń? Czy Twoje proxy działa właściwie? –

+2

Skonfigurowałeś serwer proxy HTTP, a nie serwer proxy SOCKS. SOCKS nie jest obsługiwany przez HttpClient 3. Możesz być w stanie użyć właściwości systemu "socksProxyHost" i "socksProxyPort". Lub HttpComponents HttpClient 4 może obsługiwać proxy proxy SOCKS. –

Odpowiedz

31

Dla httpclient wersji 4.1.x można ustawić proxy takiego (wzięte z 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

Nie używam nowych składników HTTP, używam commons httpclient. Może powinienem przenieść ... – dario111cro

+0

Trochę się spóźniłem na imprezę, ale to zadziałało jak urok dla moich wewnętrznych ustawień programistycznych. Wielkie dzięki i mam przegrany. – Jas

+0

to nie zadziała w proxy socks4/5 – tribbloid

0

miałem podobny problem z wersją klienta HTTP 4. nie mogę połączyć się z serwerem, ponieważ błędu serwera SOCKS i naprawiłem go, korzystając z poniższej konfiguracji:

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

5

Począwszy od Apache HTTPComponents 4.3.x Klasa HttpClientBuilder ustawia domyślne ustawienia serwera proxy na Właściwości systemu http.proxyHost i http.proxyPort lub można je przesłonić za pomocą metody setProxy.

9

Oto jak to zrobić z ostatnią wersją 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

Hi Gdzie ustawia się poświadczenia dla użytkownika/passera proxy. Niestety nie jestem tego pewien. – Anand

+0

Możesz zajrzeć tutaj http://stackoverflow.com/questions/19252946/apache-http-client-4-3-credentials-per-request –

+0

Jak mogę użyć 'CloseableHttpClient httpclient = HttpClients.createDefault();' z tomcat? Mam aplet, który wywołuje funkcję statyczną, która ma wysyłać żądanie http do innego serwera –

7

Choć kwestia ta jest bardzo stara, ale widzę, nadal nie ma dokładnej odpowiedzi. Spróbuję odpowiedzieć na to pytanie tutaj.

Podejrzewam, że w skrócie, oto jak ustawić ustawienia serwera proxy dla Apache HttpClient (org.apache.commons.httpclient.HttpClient).

Fragment kodu poniżej powinno działać:

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

Oto jak rozwiązać ten problem dla starego (< 4.3) httpclient (czego nie można uaktualnić), stosując odpowiedź Santosh Singh (który dałem +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); 
    } 
} 
Powiązane problemy