android HttpClient:确定响应中的空实体

4nkexdtk  于 8个月前  发布在  Android
关注(0)|答案(2)|浏览(99)

我想知道如何确定一个空的http响应。空的http响应我的意思是,http响应将只设置一些头部,但包含一个空的http主体。
例如:我向Web服务器发送HTTP POST,但Web服务器只会返回我的HTTP POST的状态码,而不会返回其他任何信息。
问题是,我在apache HttpClient上写了一个小的http框架来做自动json解析等。所以这个框架的默认用例是发出请求并解析响应。但是如果响应不包含数据,就像上面的例子中提到的,我会确保我的框架跳过json解析。
所以我做了这样的事情:

HttpResponse response = httpClient.execute(uriRequest);
HttpEntity entity = response.getEntity();
if (entity != null){
    InputStream in = entity.getContent();
    // json parsing
}

字符串
然而实体总是!= null。并且检索到的输入流也是!= null。有没有一种简单的方法来确定http主体是否为空?
我看到的唯一方法是服务器响应包含设置为0的Content-Length头字段。但不是每个服务器都设置此字段。
有什么建议吗?

35g0bw71

35g0bw711#

HttpClient中,getEntity()can 返回null。参见the latest samples
然而,empty 实体和 no 实体之间是有区别的。听起来你得到的是一个 empty 实体。(抱歉这么迂腐--只是HTTP太迂腐了。:)关于检测空实体,你试过从实体输入流中阅读吗?如果响应是一个空实体,你应该得到一个立即的响应。
你需要在不从实体体中阅读任何字节的情况下确定实体是否为空吗?根据上面的代码,我认为你不需要。如果是这样的话,你可以用PushbackInputStream Package 实体InputStream并检查:

HttpResponse response = httpClient.execute(uriRequest);
HttpEntity entity = response.getEntity();
if(entity != null) {
    InputStream in = new PushbackInputStream(entity.getContent());
    try {
        int firstByte=in.read();
        if(firstByte != -1) {
            in.unread(firstByte);
            // json parsing
        }
        else {
            // empty
        }
    }
    finally {
        // Don't close so we can reuse the connection
        EntityUtils.consumeQuietly(entity);
        // Or, if you're sure you won't re-use the connection
        in.close();
    }
}

字符串
最好不要将整个响应读入内存,以防它太大。这个解决方案将使用常量内存(4字节:)来测试是否为空。

HTTP/1.1规范的第4.3节:
对于响应消息,消息体是否包含在消息中取决于请求方法和响应状态代码(第6.1.1节).所有对HEAD请求方法的响应都不得包含消息体,即使实体头字段的存在可能会让人相信它们包含消息体。所有1xx 204(信息)、204(无内容)和304(未修改)响应必须不包含消息体。所有其他响应都包含消息体,尽管它可能是零长度。

sqougxex

sqougxex2#

我建议使用类EntityUtils来获取String形式的响应。如果它返回空字符串,那么响应就是空的。

String resp = EntityUtils.toString(client.execute(uriRequest).getEntity())
if (resp == null || "".equals(resp)) {
    // no entity or empty entity
} else {
    // got something
    JSON.parse(resp);
}

字符串
这里的假设是,为了代码的简单性和可操作性,您不需要区分空实体和无实体,并且如果有响应,无论如何都需要读取它。

相关问题