http的响应头,如果存在Transfer-Encoding: chunked。代表什么意思,在客户端如何解析并拿到完整的响应流

http的响应头,如果存在Transfer-Encoding: chunked。代表使用分块传输编码。

背景:在传统的请求中,HTTP的响应实体是作为整包发送给客户端的,用首部字段Content-Length,来表示响应实体的长度。这个长度对客户端十分重要,为什么这么说呢,因为客户端必须知道哪个位置才是响应消息的结束,以及后续响应的开始,服务端必须精确的告诉客户端实体长度是多少,如果Content-Length比实际返回的长度短,那么就会造成内容截断,,如果比实体内容长,客户端就一直处于pendding的状态,直到所有的实体内容都返回请求才结束。对于一个复杂页面来说,如果是等到消息体完全创建好之后再计算出Content-Length返回给客户端的话,在客户端那边会有一个漫长的等待过程,而对于用户来说,一个页面的所能容忍的等待时间不超过3秒,因此才出现了分块传输编码(Chunked Transfer Coding)。服务器发送数据时不再需要预先告诉客户端发送内容的总大小,只需在响应头里面添加Transfer-Encoding: chunked,以此来告诉浏览器我使用的是分块传输编码,这样就不需要 Content-Length 了。

分块传输编码会将实体主体分成多个部分(块),并以最后一个大小为0的块为结束。每个非空的块包括两部分:
快的长度(用十六进制表示),后面跟一个CR+LF (回车及换行),长度并不包括结尾的回车换行符
数据本身,同样后面跟一个CR+LF (回车及换行)
最后一块是单行,只由块大小(0)以及CR+LF 组成,不包含任何数据。

例如:

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

25
This is the data in the first chunk

1C
and this is the second one

3
con
8
sequence
0

解码 示意
“This is the data in the first chunk\r\n” (37 字符 => 十六进制: 0x25)
“and this is the second one\r\n” (28 字符 => 十六进制: 0x1C)
“con” (3 字符 => 十六进制: 0x03)
“sequence” (8 字符 => 十六进制: 0x08)

最终 结果
This is the data in the first chunk
and this is the second one
consequence

以上用例中,正如在首部字段 Transfer-Encoding 中指定的那样,有效使用分块传输编码,且分别被分成37字节、28 字节、3字节、8字节大小的分块数据。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值