次のコードを使用して、Webサーバーからxmlを要求しています。
HttpClient httpclient = new DefaultHttpClient()
try
{
HttpGet httpget = new HttpGet("http://63.255.173.242/get_public_tbl.cgi?A=1");
ResponseHandler responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httpget, responseHandler);
System.out.println(responseBody);
}
catch (ClientProtocolException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
httpclient.getConnectionManager().shutdown();
}
Httpclient.execute(httpget、responseHandler)を呼び出すと、clientProtocolExceptionが発生します。 URLはWebブラウザーで問題なく機能し、xmlを返し、ブラウザーに表示されます。
ClientProtocolExceptionが発生するのに、ブラウザーがそれを正常に処理する理由はありますか?
編集1:
プロトコル例外を見ると、詳細メッセージは「サーバーは有効なHTTP応答で応答できませんでした」です。ヒットしているWebサーバーを変更できません。これを無視して応答にアクセスする方法はありますか?
編集2:
サーバーが完全なヘッダーを返送していないことがわかりました。壊れたヘッダーが返された場合でも、応答の内容にアクセスする方法はありますか?
編集3:IPアドレスを編集して、ヒットしている実際のIPアドレスにしました。どんな助けでも大歓迎です。
コードは正しいように思われるので、次のことを理解する必要があります。これはクライアントの障害(無効な要求)なのか、サーバーの障害(無効な応答)なのか。これを行うには、 http trace utitlity を使用して、ブラウザーの要求をクライアントの要求と比較します。サーバーからの生の応答がある場合は、それを確認することもできます。それがわからない場合は、質問に対する生のリクエストと回答を追加してください。誰かが助けてくれるかもしれません。
私はあなたのコードを私のIPアドレスでテストしました。コードにエラーはありません。 ResponseHandler
をBasicResponseHandler
に変更しました。
これをチェックして
HttpClient httpclient = new DefaultHttpClient();
try
{
HttpGet httpget = new HttpGet("http://www.MyServer.com/get_public_tbl.cgi?A=1");
BasicResponseHandler responseHandler = new BasicResponseHandler();//Here is the change
String responseBody = httpclient.execute(httpget, responseHandler);
System.out.println(responseBody);
}
catch (ClientProtocolException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
httpclient.getConnectionManager().shutdown();
}
独自の応答インターセプターを追加して、ヘッダーを追加または削除したり、デバッグ情報を出力したりすることができます。
hc.addResponseInterceptor(new HttpResponseInterceptor() {
@Override
public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
response.getEntity().writeTo(System.out);
}
});
クライアントに設定したヘッダーを確認し、ヘッダーのキーと値の両方を再確認します。私の場合、「Cookie」の代わりに「csrf」パラメータを使用していました。
私は同様の問題、ClientProtocolExceptionに直面していました
どうやらサーバーにはターゲットのWebサービスSSLがありませんでした
SSL構成が間違っていたので、
根本的なエラーは次のとおりです。
Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
トラストストアをJavaに追加した後、このエラーは消えました。
それが誰かを助けることを願っています。
私の場合、pomファイルから以下の依存関係を削除し、問題を修正しました。
<dependency>
<groupId>org.Apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>