HTTP响应Chunked编码

来源:互联网 发布:深入java虚拟机 豆瓣 编辑:程序博客网 时间:2024/06/10 05:14

最近公司有个应用要为第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
原创粉丝点击