Webサーバーにデータを送信するデスクトップクライアントがあり、プロキシサーバーを経由できないようです。Apache HttpClientを使用してWebプロキシ経由でJava通信に失敗する
更新:プロキシを介して通信しようとすると、407 HTTPエラーが発生します。
私のWebサーバーから情報をダウンロードするときは、すべて問題ありません。ユーザーがプロキシサーバーを設定すると(私が書いたダイアログボックスを使用して)、ダウンロードは正常に動作します。しかし、org.apache.http.client.HttpClientを使用してデータをアップロードすることはできません。
JDialogから情報を収集した後、このようなコードでプロキシサーバーを構成しています。
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", "" + portNumber);
これで、簡単なダウンロードがうまくいきました。たとえば、WebサーバーからXMLデータを読み取るコードがあります(下記参照)。顧客のネットワークでは、プロキシ設定が構成される前にキャッチブロックのエラーが表示され、正しいプロキシが設定されるとすべて正常に機能しました。
しかし、Webサーバーにデータを送信しようとすると、プロキシ設定が無視されてIOExceptionがスローされるようになります。つまり、Webブラウザでアドレスをテストしたため、ポート8080が顧客のWebフィルタによってブロックされていないことが分かりました。
ユーザーが入力した登録IDを確認するコードは次のとおりです。 更新:このメソッドではプロキシも設定しています。
//Registered is just an enum with ACTIVE, INACTIVE, NOTFOUND, ERROR
public static Registered checkRegistration(int id) throws IOException {
httpclient = new DefaultHttpClient();
Config pref = Config.getConfig(); //stores user-entered proxy settings.
HttpHost proxy = new HttpHost(pref.getProxyServer(), pref.getProxyPort());
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
URIBuilder builder = new URIBuilder();
String path = "/Proctorest/rsc/register/" + id;
try {
builder.setScheme("http").setHost(server).setPort(8080).setPath(path);
URI uri = builder.build();
System.out.println("Connecting to " + uri.toString());
HttpGet httpget = new HttpGet(uri);
HttpResponse response = httpclient.execute(httpget);
System.out.println(response.getStatusLine().toString());
if(response.getStatusLine().getStatusCode()==200) {
String msg = EntityUtils.toString(response.getEntity());
GUI.globalLog.log(Level.INFO, "Server response to checkRegistration(" + id + "): " + msg);
return Registered.stringToRegistered(msg);
}
else {
GUI.globalLog.log(Level.INFO, "Server response status code to checkRegistration: " +
response.getStatusLine().getStatusCode());
return Registered.ERROR;
}
}
catch(java.net.URISyntaxException bad) {
System.out.println("URI construction error: " + bad.toString());
return Registered.ERROR;
}
}
私はこの問題は、プロキシサーバーの設定から来ていることはほぼ正だ、まだそれがかかることdocs for SystemDefaultHttpClient主張はhttp.proxyHost
とhttp.proxyPort
のシステムプロパティを使用しています。私はプロパティが正しく設定されていることを知っているが、私はまだこの認証エラーを取得しています。私のプログラムから生成されたログを見ると、私には次のようなメッセージが表示されました:
checkRegistration INFO: Server response status code to checkRegistration: 407
どうすればこの認証エラーを解決できますか?
どのようにデータを送信しますか?ポスト? PUT?パラメータを持つGET?申し訳ありませんが、私はあなたの質問から見つけることができません。 –
ここではGETを使用しています。図示されていない他の方法はPOSTを使用する。 上記のコードでは、HttpGet httpget = new HttpGet(uri); – Thorn
dev環境でプロキシを設定して、devマシンでファイアウォールを使用して、プロキシ以外のすべての発信HTTPをブロックできますか? – artbristol