cURL工具及其應用

2021-07-22 18:19:58 字數 3168 閱讀 1772

curl是利用url語法規定傳輸檔案和資料的工具,支援很多協議,如:http、ftp、telnet等。

curl是乙個通用的庫,並非php獨有。其實,很多功能用file、socket系列函式也可以實現,只不過用curl功能更全面,可將複雜的操作簡單化,比如處理cookie、表單提交、檔案上傳等。

在php中使用curl,必須開啟php的curl擴充套件庫。

1. 建立curl請求的基本步驟

2. curl模擬瀏覽器請求的例項

新建乙個php檔案demo.php,**如下:

1,'name'=>'jack');

$res = curlrequest($url,$params);

if ($res) echo $res;

?>

關於curl請求,作以下幾點說明:

3. 在 curl 中偽造頭資訊

http請求頭很重要,它是客戶端和伺服器端的身份證明和交流方式,通過篡改頭資訊,可以用curl模擬手機登入3g.qq.com。通過 curl_setopt($ch, curlopt_httpheader, $headers) 可以設定頭資訊,$headers 是多個頭域組成的陣列。

一般情況下,我們都不用指定 curlopt_httpheader,故在此不作深究。

4. 在curl中用post方式傳送資料

當發起 get 請求時,資料是通過「查詢字串」(query string)傳遞給乙個url,這時我們可以很方便的通過問號傳參的方式來實現。

但是,如果伺服器強制要求只接受post請求(如:很多api都會要求使用post請求,很多表單也會要求post方式提交表單),這時,資料是通過http請求體(或者說請求正文 request body)來傳送的,在php指令碼中實現這種post請求就稍微麻煩一點。

之前,我們已經介紹過用file或socket系列函式實現post請求,這裡我們用curl來實現post請求。

在「curl模擬瀏覽器請求的例項」中,我們封裝了乙個curl請求的函式curlrequest,並呼叫該函式,實現了在php指令碼中通過post方式訪問在該例項中,我們傳遞的post資料$params是乙個一維陣列,關於使用curl請求時傳遞的post原始資料,有以下幾種情況:

(1)post資料是一維陣列

$params = array('id'=>1,'name'=>'jack');

在  指令碼中,我們可以使用 $_post 來獲取post資料。但不能用 

file_get_contents('php://input') 來獲取post資料,因為後者獲取的是空字串。這種差異和請求頭中的 content-type有關,詳情可參考我的部落格:

(2)post資料是二維陣列

$params = array('id'=>1,'name'=>'jack', 'test'=>array(1,2,3));

這種情況,如果還用

$_post獲取post資料就會出現問題,表現在 'test'=>array(1,2,3) 這部分資料獲取不正確,$_post['test']的值竟然是字串形式的array,也就是說$_post不完整或者不正確。故不能採用直接post乙個二維陣列。

(3)post資料是用&拼接起來的標準格式的鍵值對字串

這種情況,我們就可以用

$_post獲取到完整的post資料,除了 $_post 之外,還可以用file_get_contents('php://input') 來獲取post資料,只不過後者抓取的是原始格式的字串,可通過parse_str函式將其解析到乙個陣列變數中,

如: parse_str(file_get_contents('php://input'), $arr);

(4)post資料是乙個json格式的字串

$params = array('id'=>1,'name'=>'jack', 'test'=>array(1,2,3));

$params = json_encode($params);

這種情況,無法用

$_post獲取post資料,但可以用file_get_contents('php://input') 來獲取post資料,然後用json_decode解析為陣列,如:

$arr = json_decode(file_get_contents('php://input'), true);

(5)post資料是乙個xml格式的字串

$params = '';

$params .= '1';

$params .= 'jack';

$params .= '';

這種情況,也無法使用

$_post獲取post資料,但可以用

file_get_contents('php://input')來獲取post資料,

然後用 ******xml_load_string將xml格式的資料轉換為物件,如果不習慣操作物件,還可以將物件轉換為陣列,將物件轉換為陣列的方法很多,這裡我們通過json_encode和json_decode來實現,如:

$obj = ******xml_load_string(file_get_contents('php://input'));

$arr = json_decode(json_encode($obj),true);

(6)post資料是乙個普通的字串

$params = 'success';

這種情況,也無法使用

$_post獲取post資料,但可以用file_get_contents('php://input')

來獲取post資料,如:

$str = file_get_contents('php://input');

總的來說,在curl中用post方式傳送資料時,如果post的原始資料是字串,就可以用

file_get_contents('php://input')來獲取;如果post的原始資料是一維陣列或&符號拼接的標準格式的鍵值對字串,才可以用$_post來獲取;如果post的原始資料是多維陣列,就會出現問題。

PHP封裝cURL工具類與應用示例

curlutils工具類 curl請求工具類 class curlutils 析構方法 public function destruct 新增請求頭 param array value 請求頭 public function addheader value 傳送請求 return string 返回...

CURL工具使用介紹

有時,我們會侷限於環境,無法使用 postman,swgger 等開發工具來測試介面,所以只能通過 curl 命令來測試我們的介面。因此,掌握 curl 的使用也是一項非常重要的技能。使用curl 拼接網頁位址,可以檢視網頁的原始碼,如 curl 使用引數 v 可以在控制端顯示整個curl的請求過程...

curl應用總結(三)

2 curlcode curl easy setopt curl handle,curloption option,parameter 所有引數和選項設定都是通過這個函式完成的,它告訴libcurl怎樣去進行傳輸。引數handle即為curl easy init 返回的控制代碼,後面根據option...