2010-03-21 48 views
2

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

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

Update2:我试图找到一个超过80KB的页面的响应。有趣的是响应字符串的最大长度总是18210个字符。有任何想法吗??

+0

你看过回复内容吗?你是否正在收到你期望的页面的截断版本......或者是不同的页面? – 2010-03-21 00:13:20

+0

截断版本 - 字面上是页面的前半部分。 – 2010-03-21 00:18:51

回答

2

这可能不是这样,但有时候这可能会发生,如果你不在某处刷新流。

+0

同意。特别是当线程涉及I/O时调用System.exit()。 – nicerobot 2010-03-21 00:54:43

+0

这可能是你可以详细说明的吗?获取该页面的'DefaultHttpClient'也会在之前获取6+。我是否需要明确清理/清理某些内容? – 2010-03-21 00:55:25

+0

我想你只需要确保在还有数据需要阅读时不要退出。查看关于关闭InputStream.available()的流和javadoc的javadoc http://goo.gl/iJjd http://goo.gl/qXUf – nicerobot 2010-03-21 01:41:06

0

你应该看的另一个地方是在服务器端。

一种可能性是web应用程序代码偶尔会在写回应的过程中中途摇摆不定。另一个是服务器容器代码中存在一个错误。例如,我隐约记得在某些旧版本的Tomcat中存在一个错误,导致大的响应被破坏/截断。

1

我发现这是由我在致电client.getConnectionManager().shutdown()之前阅读回复。在做请求时,我已经欺骗了其中一个finally {}块,并且关机导致竞争状态,这有时会中止读取的响应。

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