一次Http请求的Debug记

最近遇到http请求一个较大的json时,返回被截断的问题. json规模,字符数200k+,大小300-500KB.这里记录下解决思路和过程.

现象:

UA 截断否 accept-encoding
Chrome,FireFox gzip, deflate,compress
python request lib gzip, deflate
Java commons-httpclient None

初步定位:

  1. java client维度
  2. http 协议参数维度
  3. 服务端实现配置维度(未知,第三方服务)

方法论:

  1. 仔细对比java , python ,web browser三个client,在这三个维度上的差异.
  2. 抓包,从溯源而上排查Http、TCP的请求整个过程.

结论

问题较常见,也比较容易就定位到了问题::服务器close的没有发完的chunk数据包。具体服务端如何限制的不得而知(估计是nginx的缺省配置)。改进是:客户端声明接受gzip,deflate的压缩编码数据,降低数据传输量。一种治标不治本的解决方案。

对于大数据返回,首先应该考虑压缩。服务器需要开启gzip,deflate等压缩特性。比如nginx 会配置gzip 压缩,gzip_buffer等参数
客户端也应采用对应的压缩解压实现。

本例中,java:apache.common.httpclient 3.1 这个是默认不支持解压的,在http头部不会加入支持压缩编码的参数(accept-encoding), 而现代浏览器,其他较新的软件包都会默认支持这个功能。
因此,升级下java httpclient 包就圆满解决了

升华

关于http常有头部参数含义,整理一下,详细可参看RFC2616