加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:11:01 所属栏目:Java 来源:网络整理
导读:我想知道如何确定一个空的http响应. 使用空的http响应我的意思是,http响应只会设置一些标题,但包含一个空的http主体. 例如:我对网络服务器进行HTTP POST,但网络服务器只会返回我的HTTP POST的状态代码,而不会返回任何其他内容. 问题是,我在apache HttpClien
我想知道如何确定一个空的http响应.
使用空的http响应我的意思是,http响应只会设置一些标题,但包含一个空的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正文是否为空?

我看到的唯一方法是服务器响应包含Content-Length头字段设置为0.
但并非每个服务器都设置此字段.

有什么建议?

解决方法

在HttpClient中,getEntity()可以返回null.见 the latest samples.

但是,空实体与实体之间存在差异.听起来你有一个空实体. (抱歉是迂腐 – 只是HTTP很迂腐.:)关于检测空实体,你试过从实体输入流中读取吗?如果响应是空实体,则应立即获得EOF.

您是否需要确定实体是否为空而不从实体主体读取任何字节?根据上面的代码,我不认为你这样做.如果是这种情况,您可以使用PushbackInputStream包装实体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字节:)测试空白.

编辑:< pedantry>在HTTP中,如果请求没有Content-Length标头,那么应该有一个Transfer-Encoding: chunked标头.如果没有Transfer-Encoding:chunked头,那么你应该没有实体而不是空实体. < /学究气>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读