天之道,損有余而補不足。curl庫可以輕松實現http請求,而php的curl庫又是一把神器,方便又實用。無論是進行數據的上傳、下載或是訪問網絡API接口,都可以用curl庫來實現。它可以與多數的web服務器,ftp服務器交互,可以從遠程服務器獲取文件,支持各種方式請求http。今天我們就來聊一下curl庫在php中的應用。
在php中使用curl的第一步,是使用curl_init函數初始化一個curl句柄。這里我來舉一個獲取天氣API數據請求的例子:
<?php
$city = 'beijing';//假設要請求的城市為beijing
$url = 'http://v.juhe.cn/weather/index?cityname='.$city.'&type=&format=&key=*******************';//填寫你的API接口地址
$curl = curl_init();//開啟curl句柄
curl_setopt($curl, CURLOPT_URL, $url);//設置請求的url地址
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//設置獲取的信息不直接輸出到瀏覽器
$data = curl_exec($curl);//執(zhí)行curl句柄
curl_close($curl);//關閉curl句柄
echo $data;//輸出獲取到的數據
?>
這段代碼的功能是利用curl請求一個天氣API接口,請求的城市為北京,將獲取到的數據輸出到頁面上。其中,curl_setopt函數是一個非常強大的函數,無論是請求方式還是header頭信息都可以在這個函數里進行設置。
但是我們發(fā)現,從API中獲取到的數據是json格式的,那么在該如何將它轉化成PHP中的關聯數組呢?我們需要借助php的內置函數json_decode函數。這里我也同樣來舉例一下:<?php
$city = 'beijing';//假設要請求的城市為beijing
$url = 'http://v.juhe.cn/weather/index?cityname='.$city.'&type=&format=&key=*******************';//填寫你的API接口地址
$curl = curl_init();//開啟curl句柄
curl_setopt($curl, CURLOPT_URL, $url);//設置請求的url地址
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//設置獲取的信息不直接輸出到瀏覽器
$data = curl_exec($curl);//執(zhí)行curl句柄
curl_close($curl);//關閉curl句柄
$jsonData = json_decode($data, true);//將json字符串轉換成PHP關聯數組
echo '<pre>', print_r($jsonData, true), '</pre>';
?>
這段代碼的功能是一樣的,只是增加了一行將json數據轉化成php關聯數組的代碼,同時在后面輸出的時候使用了pre標簽來輸出。這樣,我們就可以測試獲取到的數組數據,方便我們取數據做進一步的處理。而json_decode函數,同樣有著強大的功能,不僅僅可以將json數據轉化成數組,還可以將數據轉化成對象。根據項目的需求不同,選擇不同的轉化方式即可。
最后還有一個問題,我們在進行一些敏感性操作的時候,需要將請求的數據加密傳輸。這里就需要用到curl請求的https協議。先證書不要慌張,我們可以先來一段簡單的代碼來測試一下https請求。<?php
$url = "https://www.baidu.com";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // 不驗證證書
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 不驗證證書
echo curl_exec($curl);//輸出獲取到的數據
curl_close($curl);
?>
從代碼中我們可以看到,和http請求的方式一致,只不過在我們使用https的時候,還需要加上一堆驗證證書不驗證證書的參數設置。這里我們可以使用一個比較好的方法是查看是否是為正常的響應數據,如下所示:<?php
$url = 'https://mydomain.com';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);//設置超時時間,單位秒
$data = curl_exec($curl);
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);//獲取返回頭的大小
$header = substr($data, 0, $headerSize);//提取出返回頭信息
$body = substr($data, $headerSize);//提取出返回體
curl_close($curl);
if (strpos($header, '200 OK') !== false) {//判斷響應代碼是否是200
echo $body;//輸出獲取到的數據
}
?>
這樣過后我們獲取的請求數據就更加安全可靠。
總之,curl是一套非常強大的工具庫,在php中得到了進一步的使用,讓我們在請求接口、數據獲取、數據上傳下載方面更加方便快捷。同時在請求https協議的接口時,注意一定要檢查證書驗證的問題。