3

我正在使用这个问题的源代码如何异步执行 httprequest 并显示下载响应的进度, 以便获取网页的 html 源并显示一个进度条,其中包含到目前为止下载的数据以及页面的总大小是多少。

该特定代码实际上不适用于 ICS 4.0.3,因为 clHeaders[0] 没有指向任何内容,并且在索引 0 处引发了称为 ArrayIndexOutOfBounds 的异常,因为服务器响应中省略了 Content-Length 标头。我尝试使用 getContentLength 以防出现问题 - 它返回负值 -1 然后我遍历所有标题并且 Content-Length 不存在。删除这些位后,代码工作正常,网页被提取,写入文件并显示正在下载的大小,但显然不是最终大小,直到我真正下载它。

我对原因只有三个想法:

  1. 我没有发送 Content-Length 标头,因此我也没有收到 - 但这听起来是错误的。另外,我不知道 HttpClient 是否没有在后台发送一个。
  2. 我在这里读到另一个问题,如果服务器的响应是流式传输或分块的,那么 getContentLength 可以返回-1。
  3. 压缩包?但我不知道如何禁用它或者是否首先启用它

如果您认为是服务器坏了,我尝试了包括 Google 在内的许多网站,但仍然没有任何 Content-Length 标头。

4

2 回答 2

0

Content-Length 标头是可选的,它仅对 HEAD 请求或非常大的数据有用,如果内容太大,客户端可能会决定要中止请求。所以是的,Content-Length 并不总是存在。除此之外,您通常应该通过读取数据来获取内容长度。

于 2013-03-08T10:33:18.030 回答
0

在某些情况下,Content-Length 不应包含在响应中或应被忽略。这些案例记录在 W3 网站上。例如,如果您的内容具有 gzip 的传输编码,则应该忽略 content-length。

于 2013-03-08T11:45:33.780 回答