W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
CURLRequest
類是一個輕量級的基于 CURL 的 HTTP 客戶端,用于同其他網(wǎng)站和服務(wù)器進行溝通。該類可用于獲取谷歌搜索的內(nèi)容,抓取一個網(wǎng)站頁面或一個圖片, 或者是用來同 API 進行信息傳遞等諸多功能。
該類模仿了 Guzzle HTTP Client 庫,因為該庫被廣泛應(yīng)用于多方面。 我們盡可能地與 Guzzle 保持語法一致,不過如果你需要一些額外的功能的話(比如該類并未提供的功能之類的),可能需要稍微更改一下語法來使用 Guzzle 庫。
注解
該類需要安裝你的 PHP 版本的 cURL 庫 。該庫是一個在大多數(shù)情況下都廣泛被使用的庫,但不是所有服務(wù)器都安裝了它。 因此請檢查你的服務(wù)器上安裝了該庫以解決依賴問題。
該類庫可以通過手動加載或者通過 服務(wù)類 加載。
通過服務(wù)類來加載 curlrequest()
方法:
$client = \Config\Services::curlrequest();
你可以將一個默認選項數(shù)組作為參數(shù)傳遞給該方法作為第一個參數(shù),用于修改 cURL 處理請求的方式。選項描述如下:
$options = [
'base_uri' => 'http://example.com/api/v1/',
'timeout' => 3
];
$client = \Config\Services::curlrequest($options);
當手動創(chuàng)建類實例時,你需要傳遞一些依賴。第一個參數(shù)是 Config\App
類的實例。第二個參數(shù)是一個 URI 實例。第三個參數(shù)是一個 Response 類的對象。 第四個參數(shù)是一個可選的 $options
數(shù)組:
$client = new \CodeIgniter\HTTP\CURLRequest(
new \Config\App(),
new \CodeIgniter\HTTP\URI(),
new \CodeIgniter\HTTP\Response(new \Config\App()),
$options
);
處理 CURL 請求基本上只是創(chuàng)建一個 Request 請求并獲取 Response 對象 的過程。這一過程就是用來處理數(shù)據(jù)交換的。 這一過程后,你可以對獲得的信息進行完全自定義的處理.
大多數(shù)交流會話是通過 request()
方法進行的,該方法觸發(fā)請求并返回一個 Response 實例。該方法將 HTTP 動詞, URL 信息和選項數(shù)組作為請求參數(shù)。:
$client = \Config\Services::curlrequest();
$response = $client->request('GET', 'https://api.github.com/user', [
'auth' => ['user', 'pass']
]);
由于該響應(yīng)是 CodeIgniter\HTTP\Response
類的一個實例對象,故而可以通過調(diào)用該類的對應(yīng)方法:
echo $response->getStatusCode();
echo $response->getBody();
echo $response->getHeader('Content-Type');
$language = $response->negotiateLanguage(['en', 'fr']);
盡管 request()
方法非常靈活,你也可以使用以下的簡稱方法。 這些方法將 URL 作為第一個參數(shù)并將選項數(shù)組作為第二個參數(shù):
* $client->get('http://example.com');
* $client->delete('http://example.com');
* $client->head('http://example.com');
* $client->options('http://example.com');
* $client->patch('http://example.com');
* $client->put('http://example.com');
* $client->post('http://example.com');
base_uri
可以在該類實例化時作為一個選項進行設(shè)置。 該參數(shù)使得你可以設(shè)置一個基礎(chǔ) URI ,并在該實例對象進行請求時使用相對 URL 路徑。這一操作在和 API 通信時特別管用:
$client = \Config\Services::curlrequest([
'base_uri' => 'https://example.com/api/v1/'
]);
// GET http:example.com/api/v1/photos
$client->get('photos');
// GET http:example.com/api/v1/photos/13
$client->delete('photos/13');
當 request()
方法或者其他簡稱方法接受相對 URI 作為參數(shù)時,就會將 base_uri 和該相對 URI 根據(jù) RFC 2986, section 2 進行組合 以下是一些組合的例子
每個 request()
函數(shù)調(diào)用都會返回一個包含有許多有用信息和方法的 Response 實例對象。最通用的方法使得你可以定制化地處理響應(yīng)對象本身。
你可以獲取響應(yīng)的狀態(tài)碼以及狀態(tài)原因:
$code = $response->getStatusCode(); // 200
$reason = $response->getReason(); // OK
你可以獲取響應(yīng)頭:
// 獲取一個響應(yīng)頭的內(nèi)容
echo $response->getHeaderLine('Content-Type');
// 獲取所有響應(yīng)頭
foreach ($response->getHeaders() as $name => $value)
{
echo $name .': '. $response->getHeaderLine($name) ."\n";
}
響應(yīng)體可以通過 getBody()
方法來獲取:
$body = $response->getBody();
響應(yīng)體是遠端服務(wù)器提供的原生響應(yīng)內(nèi)容。如果內(nèi)容類型需要格式化的話,你需要保證在代碼中這樣處理:
if (strpos($response->getHeader('content-type'), 'application/json') !== false)
{
$body = json_decode($body);
}
本節(jié)描述了在構(gòu)造函數(shù), request()
方法以及所有簡稱方法中可以傳遞的所有可用選項。
默認情況下, CURL 會遵循遠端服務(wù)器返回的所有的 “Location:” 響應(yīng)頭規(guī)則。 allow_redirects
選項使得你可以修改這一執(zhí)行過程。
如果該值被設(shè)為 false
,就不會執(zhí)行任何的重定向規(guī)則。
$client-&request(‘GET’, ‘http://example.com’, [‘a(chǎn)llow_redirects’ =& false]);
設(shè)為 true
時就會執(zhí)行請求的默認設(shè)置:
$client->request('GET', 'http://example.com', ['allow_redirects' => true]);
// 設(shè)置以下默認選項:
'max' => 5, // 終止前最多的重定向次數(shù)
'strict' => true, // 在重定向過程中確保發(fā)送的 POST 請求始終保持為 POST (譯注:某些服務(wù)器會在重定向時修改請求方法,例如 304 重定向時修改請求方式為 GET)
'protocols' => ['http', 'https'] // 限制重定向使用一個或多個協(xié)議
你可以為 allow_redirects
選項傳遞一個選項數(shù)組用于重定向時使用新的設(shè)置,而不是默認設(shè)置:
$client->request('GET', 'http://example.com', ['allow_redirects' => [
'max' => 10,
'protocols' => ['https'] // Force HTTPS domains only.
]]);
注解
當 PHP 在 safe_mode 或者 open_basedir 選項開啟時,不會進行重定向。
使得你可以為 HTTP Basic 和 Digest 和認證過程提供細節(jié)信息。 你的腳本文件需要執(zhí)行額外操作以支持診斷認證——只需要在訪問時傳遞用戶名和密碼。第三個參數(shù)是認證的類型,可以是 basic
或者 digest
:
$client->request('GET', 'http://example.com', ['auth' => ['username', 'password', 'digest']]);
對于支持請求體的方法,例如 PUT 或者是 POST 來說,有兩種方法來設(shè)置請求體。 第一種是使用 setBody()
方法:
$client->setBody($body)
->request('put', 'http://example.com');
第二種方法是通過傳遞一個 body
選項。該方式是為了與 Guzzle 兼容起見的,并提供了和上述方式一樣的功能。該值必須是一個字符串:
$client->request('put', 'http://example.com', ['body' => $body]);
指定一個 PEM 格式的客戶端證書的位置,通過為 cert
選項來傳遞絕對路徑的方式來實現(xiàn)。 如果需要密碼的話,為該選項數(shù)組的第一個元素的值為路徑,第二個元素的值設(shè)為密碼:
$client->request('get', '/', ['cert' => ['/path/getServer.pem', 'password']);
默認情況下, CodeIgniter 并未對 cURL 嘗試連接一個網(wǎng)站的時間進行限制。 如果你需要修改這個值,可以通過為 connect_timeout
選項提供時間秒數(shù)值的方式來進行。傳值為0時,無限等待:
$response->request('GET', 'http://example.com', ['connect_timeout' => 0]);
該選項指定了 CURL 用于存取 cookie 值的文件名。這一過程通過使用 CURL_COOKIEJAR 和 CURL_COOKIEFILE 選項來實現(xiàn)。 例如:
$response->request('GET', 'http://example.com', ['cookie' => WRITEPATH . 'CookieSaver.txt']);
當 debug
被傳遞并設(shè)為 true
時,就會啟動額外的調(diào)試模式并在腳本執(zhí)行時輸出標準錯誤流信息( STDERR )。 該操作是通過傳遞 CURLOPT_VERBOSE 并返回輸出來實現(xiàn)的。 因此當你需要利用 spark serve
運行一個內(nèi)置服務(wù)器時,將會看到命令行中的輸出內(nèi)容。否則輸出就會被寫入到服務(wù)器的錯誤日志中:
$response->request('GET', 'http://example.com', ['debug' => true]);
可以通過將文件名作為參數(shù)傳入的方式,將輸出寫入到文件中:
$response->request('GET', 'http://example.com', ['debug' => '/usr/local/curl_log.txt']);
使得你可以在發(fā)送請求前延遲指定的毫秒時間:
// 延時2秒
$response->request('GET', 'http://example.com', ['delay' => 2000]);
你可以通過為 form_params
選項傳遞關(guān)聯(lián)數(shù)組的方式,在一個 application/x-www-form-urlencoded POST 請求里發(fā)送表單數(shù)據(jù)。 該操作會將 Content-Type
請求頭強制設(shè)為 application/x-www-form-urlencoded
$client->request('POST', '/post', [
'form_params' => [
'foo' => 'bar',
'baz' => ['hi', 'there']
]
]);
注解
form_params
不能和multipart
選項一起使用。你可以非此即彼地使用這兩個選項。form_params
用于application/x-www-form-urlencoded
請求,而multipart
用于multipart/form-data
請求。
盡管你可以通過 setHeader()
方法來傳遞任何請求頭,你也可以通過為選項傳遞關(guān)聯(lián)數(shù)組作為參數(shù)的方式來實現(xiàn)自定義請求頭。 該關(guān)聯(lián)數(shù)組中每個鍵都是請求頭的名字,而值就是一個字符串或者是一個字符串數(shù)組,包括著請求頭字段的值:
$client->request('get', '/', [
'headers' => [
'User-Agent' => 'testing/1.0',
'Accept' => 'application/json',
'X-Foo' => ['Bar', 'Baz']
]
]);
如果請求頭在構(gòu)造函數(shù)中被傳入時,就會被設(shè)為默認選項。而默認選項會被后續(xù)設(shè)置的選項或者 setHeader()
的調(diào)用所覆蓋。
默認情況下,CURLRequest 類會在 HTTP 狀態(tài)碼大于等于400時結(jié)束請求并報錯。 你可以通過將 http_errors
選項設(shè)為 false
的方式來返回內(nèi)容:
$client->request('GET', '/status/500');
// 自動失敗報錯
$res = $client->request('GET', '/status/500', ['http_errors' => false]);
echo $res->getStatusCode();
// 500
json
選項用于上傳 JSON 編碼的數(shù)據(jù)作為請求體。同時會在請求頭上加入 Content-Type 為 application/json
。 并覆蓋先前設(shè)置的 Content-Type 請求頭。傳遞給該選項的參數(shù)可以是任何 json_encode()
函數(shù)所接受的參數(shù):
$response = $client->request('PUT', '/put', ['json' => ['foo' => 'bar']]);
注解
該選項不允許對json_encode()
和 Content-Type 請求頭進行自定義地修改。如果你需要這一功能, 就需要手動編碼數(shù)據(jù)并將其傳遞給 CURLRequest 類的setBody()
方法,并通過setHeader()
方法來設(shè)置 Content-Header 請求頭。
如果你想通過 POST 請求來發(fā)送文件或者其他數(shù)據(jù)時,可以使用 multipart
選項和 CURLFile 類 。 該選項的值應(yīng)當是一個需要關(guān)聯(lián)數(shù)組,包含有需要發(fā)送的數(shù)據(jù)。為了安全起見,上傳文件時在前綴上加上 @ 的遺留方法已被禁止。你所需要發(fā)送的文件應(yīng)當以 CURLFile 類的實例的方式傳遞:
$post_data = [
'foo' => 'bar',
'userfile' => new \CURLFile('/path/to/file.txt')
];
注解
multipart
不能和form_params
選項一起使用。你可以非此即彼地使用這兩個選項。form_params
用于application/x-www-form-urlencoded
請求,而multipart
用于multipart/form-data
請求。
你可以通過為 query
選項傳遞一個關(guān)聯(lián)數(shù)組的方式來發(fā)送查詢字符串信息:
// 發(fā)送一個 GET 請求來獲取 /get?foo=bar 的結(jié)果
$client->request('GET', '/get', ['query' => ['foo' => 'bar']]);
默認情況下, cURL 函數(shù)可以執(zhí)行任意長的時間,不受時間限制。你可以通過 timeout
選項來修改這一過程。選項值是你需要這個函數(shù)運行的時間。使用0來無限等待:
$response->request('GET', 'http://example.com', ['timeout' => 5]);
該選項描述了 SSL 驗證鑒權(quán)行為。 如果 verify
選項被設(shè)為 true
,就開始 SSL 鑒權(quán)操作并使用系統(tǒng)提供默認的 CA 包文件。如果設(shè)為 false
,就會禁用鑒權(quán)操作(這一行為不安全,并可能導(dǎo)致中間人攻擊?。?。 你可以將該參數(shù)設(shè)為一個 CA 包文件所在的路徑,從而進行自定義的鑒權(quán)操作。該選項默認值為 true
// 使用系統(tǒng)的 CA 包文件(默認設(shè)置)
$client->request('GET', '/', ['verify' => true]);
// 使用硬盤上的一個自定義的 SSL 鑒權(quán)文件
$client->request('GET', '/', ['verify' => '/path/to/cert.pem']);
// 完全禁用鑒權(quán)(不安全?。?$client->request('GET', '/', ['verify' => false]);
你可以通過為版本參數(shù)傳遞一個字符串或者浮點數(shù)(特別是1.0,或1.1,尚未支持2.0)的方式來設(shè)置協(xié)議版本:
// 強制使用 HTTP/1.0
$client->request('GET', '/', ['version' => 1.0]);
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: