Apache HttpClient返回具有空内容的实体

时间:2012-08-04 12:08:28

标签: java httpclient

我正在尝试在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在外部代码中关闭。

1 个答案:

答案 0 :(得分:1)

如果您依靠available()告诉您该实体是否为空,那么您就是在滥用它。它返回可以无阻塞地读取的字节数。检查Javadoc,在那里您将发现一个特定的警告,不使用它来预测传入数据的总长度。这不是它的用途。