1

我正在使用 Apache Commons HttpClient 从服务器中获取一些数据。我的问题是返回的 XML 数据总是被截断为前 64k。我希望这可能只是对相关对象设置限制的情况,但显然不是 - 或者至少,我找不到有关这种方法的任何信息。我假设这是一个客户端问题,因为服务器属于另一家公司,并且可能会将数据很好地提供给其他所有人。

有任何想法吗?

顺便说一句,我的代码非常简单:

protected String send(Server server, String query) throws Exception {
    PostMethod post = new PostMethod(server.getUrl());
    post.setParameter("XMLString", query);
    try {
        client.executeMethod(post);
       return post.getResponseBodyAsString();
    } finally {
        post.releaseConnection();
    }
}

仅供参考,使用 InputStreams 而不是 getResponseBodyAsString() 方法的以下代码也会发生同样的事情。

protected String send(Server server, String query) throws Exception {
    PostMethod post = new PostMethod(server.getUrl());
    post.setParameter("XMLString", query);
    try {
        client.executeMethod(post);
        InputStream stream = post.getResponseBodyAsStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        String line = null;
        StringBuilder sb = new StringBuilder();
        while ( (line=reader.readLine()) != null ) {
            sb.append(line);
        }
        return sb.toString();
    } finally {
        post.releaseConnection();
    }
}

那么,您知道某处是否设置了限制吗?字符串响应总是64k 的事实似乎表明必须有。但是哪里?!

谢谢

阿拉斯泰尔

4

2 回答 2

3

勘误:64k 限制是错误的。就像在 Eclipse 调试器的人工制品中一样,它不会显示出是截断的罪魁祸首。

解决方案:我现在的代码工作如下:

PostMethod post = new PostMethod(server.getUrl());
    post.setParameter("XMLString", query);
    post.setRequestContentLength(PostMethod.CONTENT_LENGTH_AUTO);
    post.setStrictMode(true);
    try {
        client.executeMethod(post);
        return post.getResponseBodyAsString();
    } finally {
        post.releaseConnection();
    }

我承认我不知道为什么会这样,但推测这与内容长度设置有关。

Separately, be aware that these methods are deprecated and I'm only using them because I'm working on a legacy system. If you are working on a more adaptable system I'd suggest following @HellGhost's advice.

于 2011-06-22T21:16:41.070 回答
2

将 ResponseBody 保存为字符串并返回字符串,因为releaseConnection()在返回结果之前调用了该方法。

此外,您应该考虑您是否真的想进一步使用库 HttpClient 3.x,因为开发已经设置,并且在其 HttpClient 和 HttpCore 模块中已被库 HttpComponents 项目所取代。
新 HttpClient 的示例用法:

HttpPost post = new HttpPost(server.getUrl());
HttpResponse response = client.executeMethod(post);
return EntityUtils.toString(response.getEntity());
于 2011-06-22T20:11:06.177 回答