簡體   English   中英

Apache HttpClient 響應內容長度返回 -1

[英]Apache HttpClient response content length returns -1

為什么以下代碼返回 -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();
    }
}

是否可以將響應作為字符串?

嘗試跑步

Header[] headers = response.getAllHeaders();
for (Header header : headers) {
    System.out.println(header);
}

它會打印

Date: Tue, 10 Sep 2013 19:10:04 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=dad7e2356ddb3b7a:FF=0:TM=1378840204:LM=1378840204:S=vQcLzVPbOOTxfvL4; expires=Thu, 10-Sep-2015 19:10:04 GMT; path=/; domain=.google.de
Set-Cookie: NID=67=S11HcqAV454IGRGMRo-AJpxAPxClJeRs4DRkAJQ5vI3YBh4anN3qS0EVeiYX_4XDTGN-mY86xTBoJ3Ncca7eNSdtGjcaG31pbCOuqsZEQMWwKn-7-6Dnizx395snehdA; expires=Wed, 12-Mar-2014 19:10:04 GMT; path=/; domain=.google.de; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic
Transfer-Encoding: chunked

這不是問題,您請求的頁面根本沒有在其響應中提供Content-Length標頭。 因此, HttpEntity#getContentLength()返回-1

EntityUtils有許多方法,其中一些返回String


最近運行curl會產生

> curl --head http://www.google.de
HTTP/1.1 200 OK
Date: Fri, 03 Apr 2020 15:38:18 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2020-04-03-15; expires=Sun, 03-May-2020 15:38:18 GMT; path=/; domain=.google.de; Secure
Set-Cookie: NID=201=H8GdKY8_vE5Ehy6qSkmQru13HqdGEj2tvZUFqvTDAVBxFoL4POI0swPtfI45v1TBjrJuAAfbcNMUddniIf9HHituCAFwUqmUFMDwxDYK5qUlcWiB1A64OcGp6PTT6LKur2r_3z-ToSvLf8RZhKWdny6E8SaArMpkaOqUEWp4aoQ; expires=Sat, 03-Oct-2020 15:38:18 GMT; path=/; domain=.google.de; HttpOnly
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding

標頭包含chunkedTransfer-Encoding值。 使用chunked ,響應包含前面有長度的“塊”。 HTTP 客戶端使用這些來讀取整個響應。

HTTP 規范規定,當Transfer-Encoding的值為chunked ,不應出現Content-Length標頭,如果是,則必須忽略。

請注意響應頭名稱 Transfer-Encoding。 它的值是分塊的,這意味着數據是逐塊傳遞的。 Transfer-Encoding: chunked 和 Content-Length 不會同時出現。 有兩個原因。

  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

上面的 headers 和 content 告訴我們,有兩個區塊數據。 第一個塊的大小是 11。第二個塊的大小是 3。所以內容長度是 14。

問候, 西慈

如果你真的想在不關心內容的情況下獲得內容長度,你可以這樣做。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM