2012-03-21 22 views
18

私はApacheの共通のhttpclientライブラリを使用しています。 HTTP要求をプロキシ経由で行うことは可能ですか?具体的には、マルチスレッドのPOST要求に対してプロキシリストを使用する必要があります(今はシングルスレッドのGETリクエストでテストしています)。一般的なHTTPクライアントとプロキシ

私が使用してみました:

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

私はそのコードでエラーが発生します:私はその行を削除すると、予想通り

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) 

、すべてが正常に動作します。

あなたは( this exampleから取られた)このようなプロキシを設定することができますHTTPClientの4.1.xのために
+1

本当に可能です。あなたの例外では、どのホストが編集された 'xxxxx'ですか?あなたのプロキシや宛先?なぜあなたは非常に多くの接続が拒否されていますか?プロキシは実際に正しく機能していますか? –

+2

SOCKSプロキシではなくHTTPプロキシを設定しました。 SOCKSはHttpClient 3ではサポートされていません。システムプロパティ 'socksProxyHost'と 'socksProxyPort'を使用することができます。またはHttpComponents HttpClient 4はSOCKSプロキシをサポートしています。 –

答えて

31

:私はので、サーバーに接続できませんでしたHTTPクライアントのバージョン4. と同様の問題があった

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

私は新しいHTTPコンポーネントを使用しません、私はコモンズhttpclientを使用しています。多分私は転送する必要があります... – dario111cro

+0

私はパーティーに少し遅れていますが、これは私の内部開発設定のための魅力のように働いた。多くの感謝とupvoteを持っています。 – Jas

+0

これはsocks4/5プロキシでは機能しません – tribbloid

0

SOCKSプロキシのエラーを修正し、以下の設定を使用して修正しました。

client.getParams()。setParameter( "socksProxyHost"、proxyHost); client.getParams()。setParameter( "socksProxyPort"、proxyPort);

5

Apache HTTPComponents 4.3.x以降HttpClientBuilderクラスは、プロキシのデフォルトをシステムプロパティhttp.proxyHosthttp.proxyPortに設定します。そうでない場合は、setProxyメソッドを使用してこれらの設定を上書きできます。ここで

9

この質問は非常に古いですが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

こんにちはプロキシユーザー/パスの資格情報はどこに設定しますか。申し訳ありません。 – Anand

+0

こちらをご覧くださいhttp://stackoverflow.com/questions/19252946/apache-http-client-4-3-credentials-per-request –

+0

「CloseableHttpClient httpclient = HttpClients.createDefault();」を使用するにはどうすればよいですか?風袋から?私は別のサーバーにHTTP要求を送信すると仮定静的関数を呼び出すサーブレットがあります –

7

をそれを行う方法ですが、私はまだ正確な答えはありません参照してください。私はここで質問に答えようとします。

私はApacheコモンズのHttpClient(org.apache.commons.httpclient.HttpClient)のプロキシ設定をどうやって設定するかという疑問があると思います。以下のスニペットは動作するはず

コード:

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

は私が与えたSantoshシン(の答えを使用して、(私はアップグレードできない)のHttpClient(< 4.3)古いため、この問題を解決する方法であります+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); 
    } 
} 
関連する問題