【问题标题】:Httpclient not returning entire responseHttpclient不返回整个响应
【发布时间】:2012-07-17 03:02:24
【问题描述】:

使用 HttpClient 4.0,我遇到了一个问题,我从 ResponseHandler 得到的响应只有实际页面内容的一半左右(字符串中的 ~61k 字节与返回到浏览器的页面中的 ~125k )。我似乎找不到任何可能存在某种限制的地方。有什么想法吗?

更新:我发现的另一件事是实体的getContentLength 方法返回的大小是-1,而它是前一个请求的正常值。 javadoc 似乎表明这意味着长度是未知的 - 任何想法为什么会这样?

Update2:我尝试为超过 80KB 的页面找到响应。有趣的是,响应字符串的最大长度始终为 18210 个字符。有什么想法吗??

【问题讨论】:

  • 你看过回复内容了吗?您得到的是预期页面的截断版本……还是不同的页面?
  • 截断版本——字面意思是页面的前半部分。

标签: java httpclient


【解决方案1】:

可能不是这样,但如果您没有在某处刷新流,有时可能会发生这种情况。

【讨论】:

  • 同意。尤其是当 I/O 涉及线程时调用 System.exit()。
  • 这可能是它——你能详细说明一下吗?获取该页面的DefaultHttpClient 之前也获取了 6+。我需要明确刷新/清除某些东西吗?
  • 我认为您只需要确保在仍有数据要读取时不要退出。查看关于关闭流的 javadoc goo.gl/iJjd InputStream.available() goo.gl/qXUf
【解决方案2】:

我发现这是我在阅读回复之前调用client.getConnectionManager().shutdown() 造成的。在执行请求时,我搞砸了我的 finally {} 块之一,并且关闭导致了争用条件,有时会在读取过程中终止响应。

碰巧getContentLength() 也为我返回 -1,这是由 Transfer-Encoding: chunked 标头引起的。我曾假设 HttpClient 库没有正确处理分块响应,但实际上这只是我的失误。

【讨论】:

    【解决方案3】:

    您应该查看的另一个地方是服务器端。

    一种可能性是 webapp 代码偶尔会在编写响应的过程中出现摇晃。另一个是服务器容器代码中存在错误。例如,我隐约记得在一些旧版本的 Tomcat 中存在一个错误,导致大量响应被破坏/截断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      相关资源
      最近更新 更多