HTTP响应多余字符串元凶:Content-Length、Chunked编码
最近公司有个应用要为第3方系统提供接口,大概要求就是对方向我方系统发送一个XML报文,我方根据请求报文响应数据,并以XML格式进行返回.测试的时候发现一个比较诡异的问题,有时候请求响应会无故多生成一些没有规律的字符串,并且这些字符串都在响应的body头部,由于响应是XML格式的,这些多余字符串在XML文件的<xml>标签之前,导致返回的XML文件无法得到正确解析.
使用Fire Bug检测响应头和Body截图如下:
原来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方系统无法正确确定报文的长度,导致多余字符串的生产。
推荐个工具:在问题排查过程中,我用到FireFox的FireBug插件观察HTTP请求与响应头,类似的还有HttpWatch和Chrome浏览器的“开发人员工具”,HttpWatch还可以查看chunked的个数.
参考资料:
http://www.cnblogs.com/zhaozhan/archive/2010/08/24/1807639.html
由于第3方系统强制要求,服务端必须返回Content-Length头,所以在解析的时候,由于采用Transfer-Encoding:chunked方式返回,Content-Length=0,由于第3方系统无法正确确定报文的长度,导致多余字符串的生产。
有什么办法,避免服务器采用Transfer-Encoding:chunked方式返回??
服务端响应头包含Content-Length即可
如PHP:
header(“Content-length: 响应内容大小”);