我想知道如何确定一个空的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头字段。但不是每个服务器都设置此字段。
有什么建议吗?
2条答案
按热度按时间35g0bw711#
在
HttpClient
中,getEntity()
can 返回null。参见the latest samples。然而,empty 实体和 no 实体之间是有区别的。听起来你得到的是一个 empty 实体。(抱歉这么迂腐--只是HTTP太迂腐了。:)关于检测空实体,你试过从实体输入流中阅读吗?如果响应是一个空实体,你应该得到一个立即的响应。
你需要在不从实体体中阅读任何字节的情况下确定实体是否为空吗?根据上面的代码,我认为你不需要。如果是这样的话,你可以用
PushbackInputStream
Package 实体InputStream
并检查:字符串
最好不要将整个响应读入内存,以防它太大。这个解决方案将使用常量内存(4字节:)来测试是否为空。
HTTP/1.1规范的第4.3节:
对于响应消息,消息体是否包含在消息中取决于请求方法和响应状态代码(第6.1.1节).所有对HEAD请求方法的响应都不得包含消息体,即使实体头字段的存在可能会让人相信它们包含消息体。所有1xx 204(信息)、204(无内容)和304(未修改)响应必须不包含消息体。所有其他响应都包含消息体,尽管它可能是零长度。
sqougxex2#
我建议使用类
EntityUtils
来获取String形式的响应。如果它返回空字符串,那么响应就是空的。字符串
这里的假设是,为了代码的简单性和可操作性,您不需要区分空实体和无实体,并且如果有响应,无论如何都需要读取它。