今天遇到一个很奇怪的问题,因为换服务器,同时的代码在旧服务器上用PHP curl跑一个接口,在新服务器死活报错。显示编码有问题。
经过一番的打印输出print_r(curl_getinfo($curl))
,发现,在请头部多出来了boundary=---------
bou的结尾,在旧的服务器上却没有。
在查阅的很多资料,总结出一般curl只有三种类型的数据,
1、application/x-www-form-urlencoded ,却请求头里是:Content-Type: application/json
另一个常见的 POST 数据提交的方式, Form 表单的 enctype 设置为multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符(这就是boundary的作用)分开,类似我们上面Content-Type中的例子。
由于这种方式将数据有很多部分,它既可以上传键值对,也可以上传文件,甚至多个文件。当上传的字段是文件时,会有Content-Type来说明文件类型;Content-disposition,用来说明字段的一些信息。每部分都是以 –boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(字段、文本或二进制等)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 –boundary– 标示结束。
2、multipart/form-data,却请求头里是:Content-Type: multipart/form-data
3、application/json,却请求头里是:application/json
解决办法,因为不同版本和环境对兼容性问题,对 post 提交的数据进行 http_build_query
处理,然后再发送出去,能实现更好的兼容性,更小的请求数据包。
即在post处理数据:
if ($method == 'POST') curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
这样就正常了。