web-dev-qa-db-ja.com

org.Apache.http.ConnectionClosedException:チャンクコード化されたメッセージ本文の早期終了:チャンクを閉じることが必要です

私はRestAssuredを試し、次のステートメントを書きました-

String URL = "http://XXXXXXXX";
Response result = given().
            header("Authorization","Basic xxxx").
            contentType("application/json").
            when().
            get(url);
JsonPath jp = new JsonPath(result.asString());

最後のステートメントで、次の例外が発生します。

org.Apache.http.ConnectionClosedException: Premature end of chunk coded message body: closing chunk expected

私の応答で返されるヘッダーは次のとおりです。

Content-Type → application/json; qs=1 Date → Tue, 10 Nov 2015 02:58:47 GMT Transfer-Encoding → chunked

誰かがこの例外を解決するために私を導き、私が何かまたは間違った実装を見逃している場合は私に指摘してもらえますか?.

7
palkarrohan

rest-assured とは関係のない同様の問題がありましたが、これはGoogleが最初に見つけた結果であるため、他の人が同じ問題に直面した場合に備えて、ここに回答を投稿します。

私にとって、問題は(ConnectionClosedExceptionが明確に述べているように)応答を読み取る前の接続closingでした。次のようなもの:

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);

try {
    doSomthing();
} finally {
    response.close();
}
HttpEntity entity = response.getEntity();
InputStream instream = entity.getContent(); // Response already closed. This won't work!

修正は明らかです。コードを閉じた後に応答が使用されないようにコードを配置します。

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);

try {
    doSomthing();
    HttpEntity entity = response.getEntity();
    InputStream instream = entity.getContent(); // OK
} finally {
    response.close();
}

1
asherbar

おそらく、 connection config をいじってみることができますか?例えば:

given().config(RestAssured.config().connectionConfig(connectionConfig().closeIdleConnectionsAfterEachResponse())). ..
0
Johan