Java HttpClient或PostMethod将返回数据截断为64k
我正在使用ApacheCommonsHttpClient从服务器获取一些数据。我的问题是返回的XML数据总是被截断到前64k。我希望这可能只是对相关对象设置限制的一个例子,但显然不是——或者至少,我找不到关于这种方法的任何信息。我假设这是一个客户机问题,因为服务器属于另一家公司,可能会将数据提供给其他所有人 有什么想法吗 顺便说一句,我的代码非常简单:Java HttpClient或PostMethod将返回数据截断为64k,java,apache-commons-httpclient,Java,Apache Commons Httpclient,我正在使用ApacheCommonsHttpClient从服务器获取一些数据。我的问题是返回的XML数据总是被截断到前64k。我希望这可能只是对相关对象设置限制的一个例子,但显然不是——或者至少,我找不到关于这种方法的任何信息。我假设这是一个客户机问题,因为服务器属于另一家公司,可能会将数据提供给其他所有人 有什么想法吗 顺便说一句,我的代码非常简单: protected String send(Server server, String query) throws Exception {
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()方法时也会发生同样的情况
那么,你知道某个地方有没有限制吗?字符串is response始终为64k这一事实似乎确实表明了一定存在。但是在哪里
谢谢
Alastair将响应库另存为字符串并返回字符串,因为在返回结果之前会调用方法
releaseConnection()
此外,您还应该考虑是否真的希望使用HtpCclipse 3 .x,因为开发已经被设置,并且它已经被HtpCclipse和HTTPCORE模块中的库HtpPotoProject替换了。 新HttpClient的一个示例使用:
HttpPost post = new HttpPost(server.getUrl());
HttpResponse response = client.executeMethod(post);
return EntityUtils.toString(response.getEntity());
将ResponseBy另存为string并返回字符串,因为在返回结果之前会调用方法
releaseConnection()
此外,您还应该考虑是否真的希望使用HtpCclipse 3 .x,因为开发已经被设置,并且它已经被HtpCclipse和HTTPCORE模块中的库HtpPotoProject替换了。 新HttpClient的一个示例使用:
HttpPost post = new HttpPost(server.getUrl());
HttpResponse response = client.executeMethod(post);
return EntityUtils.toString(response.getEntity());
勘误表: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的建议。勘误表: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的建议。如何初始化您的HttpClient?您是否尝试过此网站上的TIPP?你考虑过字符集吗?只是好的新旧HttpClient()。我的意思是如何构造它。如何初始化HttpClient?您是否尝试过此网站上的TIPP?你考虑过字符集吗?只是好的新旧HttpClient()。我的意思是如何构造它。我的朋友,我想更新类路径以使用当代库。然而,我的公司可能会杀了我,因为我毫无疑问会拿走一大堆有利可图但遗留下来的服务(遗憾。另外,我只想评论一下finally/return问题。finally实际上并没有中断返回行的执行,只是中断了返回的行为。只需将返回行移出try/finally块,就可以很容易地显示这一点。在这种情况下,返回值始终为null,因为此时连接已被中断已关闭。它为空,因为该方法已发布,并且所有内容都已清除。您必须在发布之前保存内容。我的朋友,我很想更新类路径以使用当代库。但是,我的公司可能会杀了我,因为我无疑会取走一批有利可图但传统的服务:(遗憾。另外,我只想评论一下finally/return问题。finally实际上并没有中断返回行的执行,只是中断了返回的行为。只需将返回行移出try/finally块,就可以很容易地显示这一点。在这种情况下,返回值始终为null,因为此时连接已被中断已关闭。它为空,因为该方法已发布,并且所有内容都已清除。您必须在执行发布之前保存内容。