HTTP响应Chunked编码

最近公司有个应用要为第3方系统提供接口,大概要求就是对方向我方系统发送一个XML报文,我方根据请求报文响应数据,并以XML格式进行返回.测试的时候发现一个比较诡异的问题,有时候请求响应会无故多生成一些没有规律的字符串,并且这些字符串都在响应的body头部,由于响应是XML格式的,这些多余字符串在XML文件的<xml>标签之前,导致返回的XML文件无法得到正确解析.

问题现象

使用Fire Bug检测响应头和Body截图如下:

Http Chuncked编码

问题原因

原来HTTP协议规定客户端有两种方式接收响应,HTTP响应一次返回数据,客户端根据响应头的Content-Length值确定响应长度,即客户端应接收的内容长度;另一种情况是一个HTTP请求分多次返回响应内容,每个返回包返回一定长度的“内容块”,直到最后接到一个长度为“0“的包结束响应。

通常,HTTP协议中使用Content-Length这个头来告知报文的长度。然后,在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。

如果要一边产生数据,一边发给客户端,WEB 服务器就需要使用”Transfer-Encoding: chunked”这样的方式来代替Content-Length。

由于第3方系统强制要求,服务端必须返回Content-Length头,所以在解析的时候,由于采用Transfer-Encoding:chunked方式返回,Content-Length=0,由于第3方系统无法正确确定报文的长度,导致多余字符串的生产。

CHUNKED编码

般HTTP通信时,会使用Content-Length头信息性来通知用户代理(通常意义上是浏览器)服务器发送的文档内容长度,该头信息定义于HTTP1.0协议RFC 1945 10.4章节中。浏览器接收到此头信息后,接受完Content-Length中定义的长度字节后开始解析页面,但如果服务端有部分数据延迟发送吗,则会出现浏览器白屏,造成比较糟糕的用户体验。

解决方案是在HTTP1.1协议中,RFC 2616中14.41章节中定义的Transfer-Encoding: chunked的头信息,chunked编码定义在3.6.1中,所有HTTP1.1 应用都支持此使用trunked编码动态的提供body内容的长度的方式。进行Chunked编码传输的HTTP数据要在消息头部设置:Transfer-Encoding: chunked表示Content Body将用chunked编码传输内容。根据定义,浏览器不需要等到内容字节全部下载完成,只要接收到一个chunked块就可解析页面.并且可以下载html中定义的页面内容,包括js,css,image等。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值