gpt4 book ai didi

java - HttpClient:确定响应中的空实体

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:39 26 4
gpt4 key购买 nike

我想知道如何确定一个空的 http 响应。对于空的 http 响应,我的意思是,http 响应只会设置一些 header ,但包含一个空的 http 正文。

例如:我向网络服务器执行 HTTP POST,但网络服务器只会返回我的 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 body是否为空?

我看到的唯一方法是服务器响应包含设置为 0 的 Content-Length header 字段。但并不是每个服务器都设置这个字段。

有什么建议吗?

最佳答案

HttpClient , getEntity() 可以返回空值。参见 the latest samples .

但是, 实体和 实体之间存在差异。听起来你有一个实体。 (抱歉有点迂腐——只是 HTTP 很迂腐。:) 关于检测空实体,您是否尝试过从实体输入流中读取数据?如果响应是一个空实体,您应该立即得到一个 EOF。

是否需要在不读取实体主体的任何字节的情况下判断实体是否为空?根据上面的代码,我不认为你这样做。如果是这种情况,您可以只包装实体 InputStream PushbackInputStream 并检查:

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 字节 :) 测试是否为空。

编辑:<pedantry>在 HTTP 中,如果请求没有 Content-Length标题,那么应该有一个 Transfer-Encoding: chunked header 。如果没有Transfer-Encoding: chunked header ,那么你应该有 no 实体而不是 empty 实体。 </pedantry>

关于java - HttpClient:确定响应中的空实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17011023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com