1. 程式人生 > >php-curl(模擬post,設定header,接收json資料)

php-curl(模擬post,設定header,接收json資料)

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)。

相關的部份程式碼片段:

$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_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資料。