java - Apache HttpClient 响应内容长度返回 -1

标签 java http apache-httpcomponents

为什么下面的代码返回-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 header 。因此,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

header 包含 Transfer-Encodingchunked。用chunked ,响应包含以其长度开头的“ block ”。 HTTP 客户端使用它们来读取整个响应。

HTTP Specification statesTransfer-Encoding 的值为 chunked 时,不应出现 Content-Length header ,如果出现则必须忽略。

关于java - Apache HttpClient 响应内容长度返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18726892/

相关文章:

java - 如何知道HttpResponse内容是字符串还是流

java - 是否可以向 HttpClient 4.4 的现有 SSL 证书添加额外的子域?

Java - 递归程序 - 将以 10 为基数的数字转换为任何基数

java - 提供配置 spring security 的方法?

java - 如何通过Spring Integration连接SOAP服务器和JSON客户端?

Angular 5 - HTTP Post x-www-form-urlencoded

rest - 当在 URL 和正文中使用 id 进行 PUT 操作时,哪一个获胜?

android - 使用 Ion android 网络库的问题

java - 有没有办法禁用本地maven存储库?

java - 在 Java 中创建和加载 cookie