PHP里使用CURL请求数据 关于 设置Content-Typ的一个问题
过完年,换了个公司,刚到公司第一个星期就发了红包,心里美美哒 ,感觉这家公司的老板很有人情味,而且公司里面美女一个比一个美 ,关键还都是老司机, 天天小火车呜呜呜,听得 我都觉得年轻了好几岁,仿佛又回到了那个满满荷尔蒙的年纪。。
说正事 ,老大交给 我一个任务:和一个第三方平台联调一个接口。 心里想这都是 小case; 我的扣扣被拉进了一个讨论组,确认对接人之后,我开始看文档,看代码接口,还有一个demo 样板;
问题是这样的: 一个合作的第三方平台使用 php 语言 发起一个post 请求,一直没有数据返回,报错的主要内容是超时;
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://dwz.cn/create.php"); curl_setopt($ch, CURLOPT_POST,true); curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); $data = array('url'=>'http://www.baidu.com/'); //$data = http_build_query($data); //建议加上,否则使用multipart/form-data类型 curl_setopt($ch, CURLOPT_POSTFIELDS,$data); $strRes = curl_exec($ch); curl_close($ch); $arrResponse=json_decode($strRes, true); if($arrResponse['status'] != 0){ echo $arrResponse['err_msg']."\n"; } echo $arrResponse['tinyurl']."\n";
这里的$data = http_build_query($data)
最终我们通过$_POST
读取到数据。
http_build_query
作用就是把参数转成URL-encode 之后的请求字符串,这个和application/x-www-form-urlencoded
方式是一致的。
为什么不使用http_build_query
方法也可以使用$_POST
获取到数据呢?
使用数组提供 post 数据时,CURL 组件大概是为了兼容 @filename
这种上传文件的写法,默认把Content-Type
设为了multipart/form-data
。虽然对于大多数服务器并没有影响,但是还是有少部分服务器不兼容。
PHP参考手册里介绍curl_setopt
时说道:
CURLOPT_POSTFIELDS
全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1¶2=val2&...'或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data。
传递一个数组到 CURLOPT_POSTFIELDS ,cURL会把数据编码成 multipart/form-data,而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。
总结:
使用 CURL 并且参数为数据时,向服务器提交数据的时候,HTTP头会发送Content_type: application/x-www-form-urlencoded
。这个是正常的网页<form>
提交表单时,浏览器发送的头部。而 multipart/form-data
我们知道这是用于上传文件的表单。包括了 boundary 分界符,会多出很多字节。在没有需要上传文件的情况下,尽量对 post
提交的数据进行 http_build_query
处理,然后再发送出去,能实现更好的兼容性,更小的请求数据包。
参考资料:http://www.cnblogs.com/52fhy/p/5436673.html