web-dev-qa-db-ja.com

Content-Lengthで区切られたメッセージ本文の早期終了(予期される:

Apache httpclientを使用してHTTP応答を取得しようとしています。ヘッダーは正常に取得されますが、コンテンツを取得しようとすると例外がスローされます。例外は次のとおりです。

 org.Apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 203856; received: 1070
        at org.Apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.Java:180)
        at Sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.Java:283)
        at Sun.nio.cs.StreamDecoder.implRead(StreamDecoder.Java:325)
        at Sun.nio.cs.StreamDecoder.read(StreamDecoder.Java:177)
        at Java.io.InputStreamReader.read(InputStreamReader.Java:184)
        at Java.io.BufferedReader.fill(BufferedReader.Java:154)
        at Java.io.BufferedReader.readLine(BufferedReader.Java:317)
        at Java.io.BufferedReader.readLine(BufferedReader.Java:382)

そして私のコードは:

InputStream is = entity.getContent();
BufferedReader br = new BufferedReader( new InputStreamReader(is, "UTF-8"));
String line;
String str = "";
while ((line = br.readLine()) != null) {

    str = str + line + "\n";

}
log.debug(str);

任意の助けをいただければ幸いです。ありがとう

16
Khanjee

問題は、貼り付けたクライアントコードではなく、サーバー側にあるようです。

サーバーはコンテンツに203856バイトが含まれているが1070しか送信されていないと主張しました.

16
Daniel Renshaw

返事が遅くなるかもしれません。しかし、私も同じ問題に遭遇します。そして、私はそれの解決を得ました。私の場合、HttpEntityを利用する前にクライアントを閉じていました。クライアントを閉じた後、ファイルをダウンロードしようとしていました。以下のコードは私がやっていたことに似ています:

HttpEntity httpEntity = null;
try (final CloseableHttpClient client = createHttpClient()) {
     httpEntity = getEntity(client);
}

return downloadFile(httpEntity, targetDirectory, fileName);

クライアントを閉じる前にファイルをダウンロードするようにコードを調整した後、それは今私のために働いています。以下のコードは私が今やったことと似ています:

try (final CloseableHttpClient client = createHttpClient()) {
     HttpEntity httpEntity = getEntity(client);
     return downloadFile(httpEntity, targetDirectory, fileName);
}
16
Nitin