java - Apache HttpClient 返回内容为空的实体

标签 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 在外部代码中关闭。

最佳答案

如果您依靠 available() 来告诉您实体是否为空,那么您就滥用了它。它返回可以在不阻塞的情况下读取的字节数。检查 Javadoc,您将在其中找到针对使用它来预测传入数据的总长度的特定警告。这不是它的目的。

关于java - Apache HttpClient 返回内容为空的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11808547/

相关文章:

java - 如何使用 okHttpClient 执行 graphql 查询?

java - Gson:无法解析日期

java - 非常大的数字选择器

java - Android Studio 1.2.2,如何更改新模块的默认包名称

c# - 取消 c# httpClient GetStreamAsync 调用

c# - 从 HttpClient 实例访问 HttpClientHandler?

Java EE "JDI Event Dispatch"错误

java - 如何使用mallet进行主题建模API

android - Android 的 HTTP CONNECT 方法

java - 无法从 Java 连接到仅支持 IPv6 的主机