Apacheの一般的なhttpclientライブラリを使用しています。プロキシ経由でHTTPリクエストを行うことはできますか?具体的には、マルチスレッドのPOSTリクエストにプロキシリストを使用する必要があります(現在、シングルスレッドのGETリクエストでテストしています)。
私は使用しようとしました:
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)
その行を削除すると、すべてが正常に実行されます。
Httpclient 4.1.xの場合、次のようにプロキシを設定できます( この例 から取得):
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();
}
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();
}
Apache HTTPComponents 4.3.x以降、HttpClientBuilderクラスは、システムプロパティhttp.proxyHost
およびhttp.proxyPort
からプロキシのデフォルトを設定します。それ以外の場合は、setProxyメソッドを使用してそれらをオーバーライドできます。
この質問は非常に古いものですが、まだ正確な答えはありません。ここで質問に答えてみます。
ここでの簡単な質問は、Apache commons HttpClient(org.Apache.commons.httpclient.HttpClient)のプロキシ設定の設定方法だと思います。
以下のコードスニペットは動作するはずです:
HttpClient client = new HttpClient();
HostConfiguration hostConfiguration = client.getHostConfiguration();
hostConfiguration.setProxy("localhost", 8080);
client.setHostConfiguration(hostConfiguration);
Santosh Singh(+1を与えた)の答えを使用して、古い(<4.3)HttpClient(アップグレードできない)でこの問題をどのように解決したかを以下に示します。
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);
}
}
HttpClient
バージョン4でも同様の問題がありました。
SOCKSプロキシエラーのためにサーバーに接続できず、以下の構成を使用して修正しました。
client.getParams().setParameter("socksProxyHost",proxyHost);
client.getParams().setParameter("socksProxyPort",proxyPort);
ソフトウェアがProxySelector
を使用し(たとえば、静的ホスト/ポートの代わりにPACスクリプトを使用するため)、HTTPComponentsがバージョン4.3以上の場合、ProxySelector
をHttpClient
このような:
ProxySelector myProxySelector = ...;
HttpClient myHttpClient = HttpClientBuilder.create().setRoutePlanner(new SystemDefaultRoutePlanner(myProxySelector))).build();
そして、いつものようにリクエストを行います:
HttpGet myRequest = new HttpGet("/");
myHttpClient.execute(myRequest);