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, $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。

傳遞一個數組到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

(完)

碼代碼 還是要靜下心來思考 心無旁騖 對的邏輯很關鍵... 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM