最近工作中需要請求一個API,由於之前接過類似的就直接拿來寫好的函數使用。但數據死活就是傳不過去,一只返回err.
代碼如下:

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 }
看起來沒什么問題,但就是不行。
到網上看了類似的解決方案后,抱着試一試的心態修改了代碼:

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
(完)
碼代碼 還是要靜下心來思考 心無旁騖 對的邏輯很關鍵...