我正在使用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似乎确实必须存在。但在哪里?!
由于
阿拉斯泰尔
答案 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());