我正在尝试在 Apache HttpClient 4.2 (Java) 的帮助下获取一系列网页。问题是:该系列中的某些 HttpEntities 内容为空,即:
is = new ByteArrayInputStream(EntityUtils.toByteArray(entity))
System.out.println(response.getStatusLine());
System.out.println(is.available());
显示 HTTP/1.1 200 OK 和 0。对于其他的,它显示,例如HTTP/1.1 200 OK 和 64344。 如果我重新启动代码,该系列中的另一个 HttpEntities 可能为空。我在同一程序中递归地获取网页,直到获得非零内容 - 经过一些调用后我得到了它......我在 Win'XP 下运行程序。
代码本身(没有递归):
public InputStream loadURL(String url) throws IOException {
PoolingClientConnectionManager connManager = new PoolingClientConnectionManager();
DefaultHttpClient httpclient = new DefaultHttpClient(connManager);
InputStream is = null;
try {
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
try {
System.out.println("========================================");
is = new ByteArrayInputStream(EntityUtils.toByteArray(entity));
System.out.println(is.available());
System.out.println(response.getStatusLine());
System.out.println("========================================");
} catch (IOException ex) {
throw ex;
} catch (RuntimeException ex) {
httpget.abort();
throw ex;
}
}
} catch (ClientProtocolException ex) {
throw ex;
} finally {
httpclient.getConnectionManager().shutdown();
}
return is;
}
InputStream 在外部代码中关闭。
最佳答案
如果您依靠 available()
来告诉您实体是否为空,那么您就滥用了它。它返回可以在不阻塞的情况下读取的字节数。检查 Javadoc,您将在其中找到针对使用它来预测传入数据的总长度的特定警告。这不是它的目的。
关于java - Apache HttpClient 返回内容为空的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11808547/