【问题标题】:Intermittently incomplete response using Apache HttpClient 3.0.1使用 Apache HttpClient 3.0.1 的间歇性不完整响应
【发布时间】:2009-07-31 20:27:22
【问题描述】:

我对此感到困惑,所以我想我会问一下,以防你们中的任何人遇到它,因为 HttpClient 开发有点像一门艺术。

我面临的问题是:一个应用程序正在使用 Apache HttpClient Java 库与同一公司网络中的服务器进行通信。大多数时候它可以正常工作,但有时我们会看到由于响应不完整而导致的大量异常:它们都缺少结束标记的最后三个字符,因此客户端中的解析器会抱怨。这可能会持续 5 到 10 分钟,然后消失。

我无法在本地复制此问题,并且我已验证响应完全由服务器编写。客户端通过 PostMethod 的 getResponseBodyAsStream() 方法获取响应内容,但只调用了一次。也许它需要循环调用此方法,直到它在响应被缓冲的极少数情况下为空?

我将不胜感激。

编辑:服务器正在写入内容长度标头并正确刷新,在客户端,数据被读入字符串:

//method is a PostMethod, client is a HttpClient
client.executeMethod(hostconfig, method); 

InputStream is = method.getResponseBodyAsStream();
String response = null;

try {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();    
    byte[] buf = new byte[1024];
    int len;

    while ((len = is.read(buf)) > 0) {
        bos.write(buf, 0, len);
    }

    response = new String(bos.toByteArray(), "UTF-8");

} ... // closing try block

【问题讨论】:

  • 编辑:与许多难以发现的错误一样,问题似乎与特殊字符有关(欧洲重音字符、德语 long-s 等)。一旦消息被规范化以删除这些字符,错误就停止了。
  • 有类似的问题。完全相同的网址。使用浏览器/Curl 给我完整的数据。但是,Httpclient 得到不完整的输出......!

标签: java http httpclient


【解决方案1】:

服务器的内容长度标头是否设置正确?我不是 100% 确定 Commons-HttpClient 是否尊重这些,但它很容易做到。我想不出您需要重复调​​用 getResponseBodyAsStream 的任何原因。

也可以想象,您用于读取流的代码做出了错误的假设。也许我们可以看到您如何读取数据的 sn-p 以确保您实际上正确地读取了整个流?那里的一些常见编码错误可能导致只能读取缓冲量(这将导致看似随机的故障)。

除此之外,很难说……我们经常使用 Commons HttpClient,没有类似的症状。

【讨论】:

  • 嗨 jsight,感谢您的回复。我编辑了问题以澄清。服务器正在正确写入标头并刷新,我添加了从 Stream 读取的代码。我还查看了客户端正在使用的 HttpClient 配置,唯一让我感到震惊的是将 Linger-on-timeout 参数显式设置为 0(禁用)。
【解决方案2】:

我也遇到过这个问题。此问题仅在将 URL 从 localhost 更改为公共 URL 后出现。

我找到了几个解决方案...

我发现的第一个“解决方案”是在开始读取过程之前执行 Thread.sleep(1000)。我认为这会导致缓冲区在尝试读取之前被填充。 (我知道这没有意义,因为 read() 声明它会阻塞直到数据可用,但不幸的是,read 方法有时认为它比预期更早到达终点)。这更像是一个丑陋的补丁,所以我一直在寻找......

第二种选择也是最好的选择是使用 BufferedReader 中的 readLine() 方法。此方法正确实现了读取过程。我还没有阅读 readLine 的源代码,但我认为我们可以在那里找到解决问题的方法。

您好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2011-01-28
    • 2014-11-09
    • 1970-01-01
    • 2014-01-27
    • 2011-05-26
    相关资源
    最近更新 更多