編碼的世界 / 優質文選 / 文明

php-curl(模擬post,設置header,接收json數據)


2021年10月04日
-   

CURL模擬POST請求
curl可以使用url的方式來模擬瀏覽器傳輸數據,是很有用的一個功能。
curl的操作可以分為4步:
1、初始化:curl_init()
2、設置屬性值:curl_setopt()
3、執行:curl_exec()
4、退出關閉:curl_close()

測試: 模擬一個php文件(2.php)向另一個php文件(3.php)發送post請求,並接收其返回值進行輸出的過程。
post發送方(2.php)
<?php
$url = 'http://localhost/3.php';
$opt_data = 'name=BY2&age=999&sex=MAXMAN';
$curl = curl_init(); //初始化
curl_setopt($curl,CURLOPT_URL,$url); //設置url
curl_setopt($curl,CURLOPT_HTTPAUTH,CURLAUTH_BASIC); //設置http驗證方法
curl_setopt($curl,CURLOPT_HEADER,0); //設置頭信息
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); //設置curl_exec獲取的信息的返回方式
curl_setopt($curl,CURLOPT_POST,1); //設置發送方式為post請求
curl_setopt($curl,CURLOPT_POSTFIELDS,$opt_data); //設置post的數據
$result = curl_exec($curl);
if($result === false){
echo curl_errno($curl);
exit();
}
print_r($result);
curl_close($curl);
?>

post接收方(3.php)
<?php
$name = $_POST['name'];
$age = $_POST['age'];
$sex = $_POST['sex'];
if(empty($name) || empty($age) || empty($sex)){
return 'post value is empty';
}
$str = '歡迎來到北京,'.$name;
$str .= ',你今年'.$age.'歲,真長壽';
$str .= ',你是個強壯的'.$sex;
echo $str;

測試驗證時,如果出現錯誤,會打印錯誤信息。 如果測試過程中沒有出現錯誤,會打印如下信息:
歡迎來到北京,BY2,你今年999歲,真長壽,你是個強壯的MAXMAN

curl中有一個方法curl_getinfo(),可以用來獲取一些有用的信息,將這個方法加入到2.php中:
//插入到這個位置即可
print_r($result);
$info = curl_getinfo($curl);
print_r($info);
curl_close($curl);

再看一下現在的運行結果已經獲取到了許多有用的信息:
歡迎來到北京,BY2,你今年999歲,真長壽,你是個強壯的MAXMAN
Array
(
[url] => http://localhost/3.php
[content_type] => text/html
[http_code] => 200
[header_size] => 169
[request_size] => 150
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 0
[connect_time] => 0
[pretransfer_time] => 0
[size_upload] => 27
[size_download] => 75
[speed_download] => 75
[speed_upload] => 27
[download_content_length] => 75
[upload_content_length] => 27
[starttransfer_time] => 0
[redirect_time] => 0
[certinfo] => Array
(
)
[redirect_url] =>
)

Comments:如果瀏覽器顯示亂碼,“自定義及控制”->”更多工具”->”編碼”->修改編碼方式即可(chrome)。
CURL設置Authorization頭信息&發送接收JSON數據
相關的部份代碼片段:
$opt_data = json_encode($data);
$header = array();
$header[] = 'Authorization:'.$tmp;
$header[] = 'Accept:application/json';
$header[] = 'Content-Type:application/json;charset=utf-8';
$curl = curl_init(); //初始化
curl_setopt($curl,CURLOPT_URL,$url); //設置url
curl_setopt($curl,CURLOPT_HTTPHEADER,$header);
curl_setopt($curl,CURLOPT_POSTFIELDS,$opt_data);

在接收端,發現使用
POST是接收不到數據的,當然
_POST是接收不到數據的,當然_REQUEST也是一樣,那麼我們傳的JSON數據哪裏去了呢?怎麼才能接收到傳遞的JSON數據?
使用如下方法:
$GLOBALS['HTTP_RAW_POST_DATA'];

為什麼會出現POST獲取不到傳送的數據的問題呢?因為$_POST只能接收文檔類型為“Content-Type: application/x-www-form-urlencoded”格式提交的數據。 HTTP_RAW_POST_DATA是用來接收原始的POST數據的,只有在碰到未識別的MIME類型時才會被填充,所以使用它可以獲取到上面代碼POST的json數據。

熱門文章