PHP POST请求 字符串和数组传值的区别
最近工作中需要请求一个API,由于之前接过类似的就直接拿来写好的函数使用。但数据死活就是传不过去,一只返回err.
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 function post_params($url, $params,$headers) { 2 $ch = curl_init(); 3 curl_setopt($ch, CURLOPT_POST, 1); 4 curl_setopt($ch, CURLOPT_URL, $url); 5 curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 6 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 7 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 8 $json= curl_exec($ch); 9 curl_close($ch); 10 return $json; 11 }
看起来没什么问题,但就是不行。
到网上看了类似的解决方案后,抱着试一试的心态修改了代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 function curlPost($url, $headers, $post){ 2 $ch = curl_init(); 3 curl_setopt($ch,CURLOPT_URL,$url); 4 if(!empty($headers)){ 5 curl_setopt($ch,CURLOPT_HTTPHEADER,$headers); 6 } 7 curl_setopt($ch, CURLOPT_POST, 1);//POST 8 curl_setopt($ch, CURLOPT_POSTFIELDS, 9 http_build_query($post));//postData 10 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //success 11 curl_setopt($ch, CURLOPT_HEADER,0); 12 curl_setopt($ch, CURLINFO_HEADER_OUT,1); 13 $json = curl_exec($ch); 14 return $json; 15 }
然后重新请求,OK了...
啥情况呢?
我的理解是:在当CURLOPT_POSTFIELDS被设置为数组时,Content-type 被设置成了multipart/form-data;
而用字符串传值时,Content-type为application/x-www-data-urlencoded。
传递一个数组到CURLOPT_POSTFIELDS,cURL会把数据编码成 multipart/form-data,而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。
代码中添加的http_build_query()函数的作用是使用给出的关联(或下标)、数组生成一个经过URL-encode的请求字符串;
写法格式:http_build_query ( mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )
举个例子:$data = array("name"=>"callback" , "value"=>"test");
$rescult = http_build_query($data);
我们输出下$rescutl可以得到:
name=callback&value=test
这个有什么用呢,这是模拟http请求的,把得到的数据data通过函数URL-encode,一般是用在回调。(完)
结论:API接收的是字符串!http_build_query()把数组转为字符串传递。
相关链接:https://blog.csdn.net/u011250882/article/details/48983929
(完)
码代码 还是要静下心来思考 心无旁骛 对的逻辑很关键...