2012-03-21 44 views
18

Tôi đang sử dụng thư viện httpnhient phổ biến của apache. Có thể thực hiện yêu cầu HTTP qua proxy không? Cụ thể hơn, tôi cần sử dụng danh sách proxy cho các yêu cầu POST đa luồng (ngay bây giờ tôi đang thử nghiệm với các yêu cầu GET luồng đơn).HTTPclient và proxy phổ biến

Tôi cố gắng để sử dụng:

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

tôi nhận lỗi với mã:

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) 

Khi tôi loại bỏ dòng đó, tất cả mọi thứ chạy tốt như mong đợi.

+1

Thực sự là có thể. Trong trường hợp ngoại lệ của bạn, máy chủ lưu trữ nào là 'xxxxx' được biên tập lại? Proxy của bạn hoặc đích đến? Tại sao bạn có quá nhiều kết nối bị từ chối? Proxy của bạn có thực sự hoạt động đúng không? –

+0

xxxxx là máy chủ mà tôi đang gửi yêu cầu, chứ không phải proxy. Proxy sẽ hoạt động. Tôi đang sử dụng loại proxy 5. – dario111cro

+2

Bạn đã định cấu hình proxy HTTP, không phải proxy SOCKS. SOCKS không được hỗ trợ bởi HttpClient 3. Bạn có thể sử dụng thuộc tính hệ thống 'socksProxyHost' và 'socksProxyPort'. Hoặc HttpComponents HttpClient 4 có thể hỗ trợ SOCKS proxy. –

Trả lời

31

Đối httpclient 4.1.x bạn có thể thiết lập proxy như thế này (lấy từ 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

Tôi không sử dụng các thành phần HTTP mới, tôi đang sử dụng http: // commons. Có lẽ tôi nên chuyển ... – dario111cro

+0

Tôi hơi muộn một chút, nhưng điều này làm việc như sự quyến rũ cho các thiết lập phát triển nội bộ của tôi. Rất cám ơn và có một upvote. – Jas

+0

điều này sẽ không hoạt động ở socks4/5 proxy – tribbloid

0

Tôi đã có một vấn đề tương tự với phiên bản Http client 4. tôi không thể kết nối đến máy chủ vì của lỗi proxy SOCKS và tôi đã sửa lỗi bằng cấu hình bên dưới:

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

5

Bắt đầu từ Apache HTTPComponents 4.3.x Lớp HttpClientBuilder đặt mặc định proxy từ Thuộc tính hệ thống http.proxyHosthttp.proxyPort hoặc nếu không bạn có thể ghi đè chúng bằng phương pháp setProxy.

9

Dưới đây là làm thế nào để làm điều đó với phiên bản cuối cùng của 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

Xin chào Nơi đặt thông tin xác thực cho người dùng/thẻ proxy. Xin lỗi không chắc chắn về điều này. – Anand

+0

Bạn có thể xem tại đây http://stackoverflow.com/questions/19252946/apache-http-client-4-3-credentials-per-request –

+0

Làm cách nào để sử dụng 'CloseableHttpClient httpclient = HttpClients.createDefault();' từ tomcat? Tôi có một servlet gọi hàm tĩnh giả sử gửi một yêu cầu http đến một máy chủ khác –

7

Mặc dù câu hỏi này là rất cũ, nhưng tôi thấy vẫn không có câu trả lời chính xác. Tôi sẽ cố gắng trả lời câu hỏi ở đây.

Tôi tin rằng câu hỏi ngắn gọn ở đây là cách thiết lập cài đặt proxy cho Apache Commons HttpClient (org.apache.commons.httpclient.HttpClient).

đoạn mã dưới đây sẽ làm việc:

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

Dưới đây là cách tôi giải quyết vấn đề này cho người cao tuổi (< 4.3) HttpClient (mà tôi không thể nâng cấp), sử dụng câu trả lời của Santosh Singh (người mà tôi đã đưa ra một +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); 
    } 
} 
Các vấn đề liên quan