首页 > PHP, 其他 > HTTP响应多余字符串元凶:Content-Length、Chunked编码

HTTP响应多余字符串元凶:Content-Length、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方系统无法正确确定报文的长度,导致多余字符串的生产。

推荐个工具:在问题排查过程中,我用到FireFox的FireBug插件观察HTTP请求与响应头,类似的还有HttpWatch和Chrome浏览器的“开发人员工具”,HttpWatch还可以查看chunked的个数.

 


参考资料:

http://www.cnblogs.com/zhaozhan/archive/2010/08/24/1807639.html

  1. 2013年7月15日18:14 | #1

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

    有什么办法,避免服务器采用Transfer-Encoding:chunked方式返回??

    • 直来直往
      2013年7月27日11:34 | #2

      服务端响应头包含Content-Length即可
      如PHP:
      header(“Content-length: 响应内容大小”);

  1. 本文目前尚无任何 trackbacks 和 pingbacks.

=3加9(必填)请输入两数相加的结果。