【问题标题】:Why is the Content-Length header omitted from server response when using HttpClient?为什么使用 HttpClient 时服务器响应中省略了 Content-Length 标头?
【发布时间】:2013-01-31 22:36:08
【问题描述】:

我正在使用这个问题的源代码How to asynchronous perform a httprequest and show the progress of downloading the response 来获取网页的 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 标头。

【问题讨论】:

    标签: android http-headers


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-02-02
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        • 2011-06-18
        • 1970-01-01
        相关资源
        最近更新 更多