PHP POST請求 字符串和數組傳值的區別
最近工作中需要請求一個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, $paramsView Code); 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($urlView Code, $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。
代碼中添加的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
(完)
碼代碼 還是要靜下心來思考 心無旁騖 對的邏輯很關鍵...
PHP POST請求 字符串和數組傳值的區別