我使用的是这个问题的源代码如何异步执行httprequest并显示下载响应的进度,以获取网页的html源代码,并显示进度条,其中包含迄今为止下载的数据以及页面的总大小。
该特定代码实际上在ICS 4.0.3上不起作用,因为clHeaders[0]没有指向任何内容,并且在索引0处引发了一个名为ArrayIndexOutOfBounds的异常,因为服务器的响应中省略了Content-Length标头。我尝试使用getContentLength以防出现问题——它返回了-1的负值,然后我迭代了所有的头,但Content-Length不存在。删除这些比特后,代码运行良好,提取一个网页,写入一个文件,并显示下载时的大小,但显然不是最终大小,直到我真正下载完为止。
我对原因只有三个想法:
- 我没有发送Content-Length标头,因此也没有收到标头,但这听起来是错误的。另外,我不知道HttpClient是否没有在后台发送一个
- 我在另一个问题中读到,如果服务器的响应是流式的或分块的,那么getContentLength可以返回-1
- Gzip?但我不知道如何禁用它,也不知道它是否一开始就启用了
如果你认为是服务器坏了,我尝试了包括谷歌在内的许多网站,但仍然没有任何Content-Length标头。
Content-Length头是可选的,它主要只对HEAD请求或非常大的数据有用,如果内容太大,客户端可能会决定中止请求。所以,是的,内容长度死亡并不总是存在的。除此之外,您通常应该通过读取数据来获得内容长度。
在某些情况下,内容长度不应包含在响应中或应被忽略。这些案例记录在W3网站上。例如,如果您的内容具有gzip的传输编码,则应忽略内容长度。