一、背景
作爲經常需要使用到的API,項目可以添加GuzzleHttp擴展來使用,方便,快捷,全面;
這次我們項目開發使用的是laravel5.8,那麼對於接口數據均是採用GuzzleHttp來獲取的,文檔有較爲全面的使用介紹,本仙女這就只總結自己能用到的喲
二、封裝使用
/**
* 請求接口,獲取e信使用戶需要完成的閱讀任務
* @param string $post 請求方式
* @param array $data 請求數據
* @param string $sRequUrl 請求接口地址
* @return array
*
* @throws GuzzleException
*/
public function sendRequest($post = 'GET', $sRequUrl, $data = [])
{
if (config('app.env') != 'production') {
return false;
}
//區分請求方式
$aParams =[];
if($post == 'GET' ){
$aParams = ['query'=>$data];
}else if($post == 'POST' ){
$aParams = ['form_params'=>$data];
}
try {
$httpClient = $httpClient = new Client([
'timeout' => 60
]);
$sHttpRes = $httpClient->request($post, $sRequUrl, $aParams)->getBody()->getContents();
return json_decode($sHttpRes, true);
} catch (\Exception $exception) {
info('調用接口發生錯誤--------------' . $sRequUrl);
info($exception);
info('------------------------');
}
return false;
}
這裏是一個封裝好的方法,但僅僅是對get和post做了處理,接下來是使用步驟的描述;
2.1 Making a Request
首先創建一個GuzzleHttp\ClientInterface 對象,用來發送請求;
use GuzzleHttp\Client;
$httpClient = new Client([
// Base URI is used with relative requests
'base_uri' => 'http://httpbin.org',
// You can set any number of default request options.
'timeout' => 2.0,
]);
因爲我這個方法是用戶承接不同網站的數據,數據在創建對象的時候並沒有初始化一個base_uri,
2.2 Sending Requests
$response = $client->get('http://httpbin.org/get');
$response = $client->post('http://httpbin.org/post');
$client->request('GET', 'http://httpbin.org', ['query' => 'foo=bar']);
等形式,沒有參數時,倒是不用操作,但是接口參數是一般都有的,所以當你使用get或者post請求方式的時候就要做一個區分處理了,對於get:參數放在query的數組裏面;對於post:參數是放在頭部參數form_params數組裏的;
2.3 Using Reponses
請求發送以後,就是響應的接收處理啦。
$ body = $ response - > getBody ();
這是獲取響應Reponse的整體,獲取響應的內容則是$body->getContents();
至此大致的邏輯就已經可以了。
2.4 異步請求的封裝
/**
* 請求接口,獲取e信使用戶需要完成的閱讀任務
* @param string $post 請求方式
* @param string $sRequUrl 請求接口地址
* @param array $data 請求數據
* @return bool
*/
public function sendAsyncRequest($post = 'GET', $sRequUrl, $data = [])
{
try {
$httpClient = new Client([
'timeout' => 60
]);
$httpClient->requestAsync($post, $sRequUrl, ['query' => $data])
->then(
function (ResponseInterface $res) {
info($res->getBody()->getContents());
return json_decode($res->getBody()->getContents(), true);
},
function (RequestException $e) {
info('調用接口發生錯誤--------------');
info($e->getMessage());
}
)->wait();
} catch (\Exception $exception) {
info('調用接口發生錯誤--------------' . $sRequUrl);
info($exception);
info('------------------------');
}
return false;
}
這都是本人正在使用的接口,希望分享出來有幫助到你!
三、寫在最後
這個用起來還是很方便的,大家可以再深入研究一下,這裏是GuzzleHttp文檔