Java HttpClient或PostMethod截断返回数据到64k

时间:2011-06-22 19:58:40

标签: java apache-commons-httpclient

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

有什么想法吗?

我的代码btw非常简单:

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();
    }
}

fyi,使用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();
    }
}

那么,你知道某个地方是否有限制吗? String是响应的事实总是 64k似乎确实必须存在。但在哪里?!

由于

阿拉斯泰尔

2 个答案:

答案 0 :(得分:3)

ERRATUM: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();
    }

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

另外,请注意这些方法已弃用,我只使用它们,因为我正在使用遗留系统。如果您正在开发一个更具适应性的系统,我建议遵循@ HellGhost的建议。

答案 1 :(得分: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());