起因
开发者在论坛发贴说php sdk有个问题,并初步定位,找到了解决方案,但不明白原因,详见:http://open.taobao.com/bbs/read.php?tid=18801
解决过程
因为我看到帖子后在正式环境和沙箱都不能重现,留言让开发者旺旺远程协助
下午5点,技术支持旺旺联系上了开发者,经过1个半小时远程桌面调试,最终找到问题原因,解决方法已经告诉开发者,SDK也已更新。
技术分析
这是一个HTTP通信的细节,php curl向top发起请求的时候,默认设置了HTTP POST方式,但又没设置POST的内容,结果导致libcurl发出了一个HTTP请求,包含这样的HEADER:
Expect: 100-continue
Content-Length: -1
Apache看到这样的请求,就给扔了一个302回来了。
Expect: 100-continue是干嘛的?
正常情况下,只有当post body超过1024字节的时候,才需要http client发出带Expect: 100-continue的请求,web server给出一个100-Continue的响应,client再发送请求的内容。
为什么会有Content-Length: -1?
因为php sdk设了POST方式(curl_setopt($ch, CURLOPT_POST, true);)却没给它POST内容,所以长度就成-1了
为什么我无法重现?
因为我用的是php 5.2.12/libcurl 7.19.3,这个curl版本是不会出这个错的,把这个错误兼容掉了。
而开发者用的是php5.2.13/libcurl 7.20.0,这个curl版本支持http协议比较严格,不再兼容了,就出错了。
环境导致的问题不好查,所以远程协助搞了90分钟。
结论
结合上次multipart的问题来看,HTTP通信对多数开发者(不管是java还是php)都是比较难的技术点,还是用官方的SDK省事
ps: java sdk不存在这个问题