web-dev-qa-db-ja.com

httpClient.execute(httpget、responseHandler)のClientProtocolException

次のコードを使用して、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アドレスにしました。どんな助けでも大歓迎です。

7
Kevin Westwood

コードは正しいように思われるので、次のことを理解する必要があります。これはクライアントの障害(無効な要求)なのか、サーバーの障害(無効な応答)なのか。これを行うには、 http trace utitlity を使用して、ブラウザーの要求をクライアントの要求と比較します。サーバーからの生の応答がある場合は、それを確認することもできます。それがわからない場合は、質問に対する生のリクエストと回答を追加してください。誰かが助けてくれるかもしれません。

7

私はあなたのコードを私のIPアドレスでテストしました。コードにエラーはありません。 ResponseHandlerBasicResponseHandlerに変更しました。

これをチェックして

 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();
    }
2
Ram kiran

独自の応答インターセプターを追加して、ヘッダーを追加または削除したり、デバッグ情報を出力したりすることができます。

hc.addResponseInterceptor(new HttpResponseInterceptor() {
    @Override
    public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
        response.getEntity().writeTo(System.out);
    }
});
2
lanwen

クライアントに設定したヘッダーを確認し、ヘッダーのキーと値の両方を再確認します。私の場合、「Cookie」の代わりに「csrf」パラメータを使用していました。

1
Rahul Jain

私は同様の問題、ClientProtocolExceptionに直面していました
どうやらサーバーにはターゲットのWebサービスSSLがありませんでした
SSL構成が間違っていたので、

根本的なエラーは次のとおりです。

  Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

トラストストアをJavaに追加した後、このエラーは消えました。

それが誰かを助けることを願っています。

0
user648026

私の場合、pomファイルから以下の依存関係を削除し、問題を修正しました。

    <dependency>
        <groupId>org.Apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.9</version>
    </dependency>
0
Madhu Stv