1. 程式人生 > >PHP POST請求 字符串和數組傳值的區別

PHP POST請求 字符串和數組傳值的區別

urn enc all function llb php ray url 傳遞

  最近工作中需要請求一個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 }
View Code

看起來沒什麽問題,但就是不行。

到網上看了類似的解決方案後,抱著試一試的心態修改了代碼:

技術分享圖片
 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 }
View Code

然後重新請求,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請求 字符串和數組傳值的區別