6

次のコードが -1 を返すのはなぜですか? リクエストが失敗したようです。

public static void main(String[] args)
{
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet("http://www.google.de");

    HttpResponse response;
    try
    {
        response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity();
        EntityUtils.consume(entity);

        // Prints -1
        System.out.println(entity.getContentLength());
    }
    catch (ClientProtocolException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        httpGet.releaseConnection();
    }
}

また、レスポンスを文字列として取得することは可能ですか?

4

3 に答える 3

4

応答ヘッダー名が Transfer-Encoding であることに注意してください。その値はチャンクされます。つまり、データはブロックごとに配信されます。Transfer-Encoding: chunked と Content-Length が同時に出てこない。2つの理由があります。

  1. サーバーは、送信されたコンテンツの長さを望んでいません。
  2. または、サーバーのバッファよりも大きなサイズのデータ​​をフラッシュする場合、サーバーはコンテンツの長さを知りません。

そのため、コンテンツの長さヘッダーがない場合、コンテンツの本文の前に各チャンク ブロックのサイズを確認できます。例えば:

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Set-Cookie: JSESSIONID=8A7461DDA53B4C4DD0E89D73219CB5F8; Path=/

Content-Type: text/html;charset=UTF-8

Transfer-Encoding: chunked

Date: Wed, 18 Mar 2015 07:10:05 GMT

11

helloworld!

3

123

0

上記のヘッダーとコンテンツは、2 つのブロック データがあることを示しています。最初のブロックのサイズは 11 です。2 番目のブロックのサイズは 3 です。つまり、コンテンツの長さは 14 です。

よろしく、 Xici

于 2015-03-19T03:09:35.690 に答える
1

コンテンツを気にせずにコンテンツの長さを本当に取得したい場合は、これを行うことができます。

EntityUtils.toByteArray(httpResponse.getEntity()).length

于 2013-11-08T22:34:09.627 に答える