一、介紹
GuzzleHttp是一個基於PSR-7標準的PHP HTTP客戶端,可以輕鬆地發送HTTP請求和快速處理響應。它是Guzzle 5和Guzzle 6的升級版。Guzzle 6需要PHP 5.5或更高版本。
GuzzleHttp使用可重用的連接池和Web服務完整性來加速請求,同時支持非同步請求和PSR-7中間件。本文將詳細介紹GuzzleHttp的使用。
二、安裝和基本使用
首先需要在項目中載入GuzzleHttp的Composer包,執行以下命令:
composer require guzzlehttp/guzzle
然後,你可以使用GuzzleHttp客戶端來創建和發送HTTP請求,例如發送GET請求:
use GuzzleHttp\Client;
$client = new Client();
$res = $client->request('GET', 'https://api.github.com/');
echo $res->getStatusCode(); // 200
echo $res->getHeaderLine('content-type'); // 'application/json; charset=utf8'
echo $res->getBody(); // '{"type":"User"...'
上述代碼發送了一個GET請求到Github API,並列印出了響應狀態碼、Content-Type和響應主體。
三、請求配置
GuzzleHttp的請求配置都包含在一個關聯數組中,可以使用request方法的第二個參數來傳遞配置:
$client = new Client();
$res = $client->request('GET', 'https://api.github.com/', [
'auth' => ['user', 'pass']
]);
上面的代碼中,GuzzleHttp使用HTTP Basic身份驗證發送了一個GET請求。請求配置還可以包括query、headers、body、timeout、verify(SSL證書驗證)等參數。
四、響應處理
GuzzleHttp的響應是一個 Psr\Http\Message\ResponseInterface 實例,它包含了響應的所有信息。例如,響應狀態碼可以使用getStatusCode()方法獲取:
use Psr\Http\Message\ResponseInterface;
$res = $client->request('GET', 'https://api.github.com/');
$status_code = $res->getStatusCode();
響應主體可以使用getBody()方法獲取。如果響應是JSON格式,可以使用json_decode()函數轉換成PHP對象或數組。
$body = $res->getBody();
$json = json_decode($body);
echo $json->name;
除此之外,GuzzleHttp還提供了更豐富的響應處理方法和異常處理機制。
五、同步和非同步請求
在發送HTTP請求時,GuzzleHttp支持同步和非同步兩種方式。
同步請求在請求時會阻塞當前線程直到響應返回。非同步請求允許在請求被發送後立即返回,並使用promise非同步處理響應。Promise機制是一種處理非同步操作的方式,可以在響應到達時觸發回調處理。
$promise = $client->requestAsync('GET', 'https://api.github.com/users/darrenliu');
$promise->then(
function (ResponseInterface $res) {
echo $res->getStatusCode() . "\n";
},
function (RequestException $e) {
echo $e->getMessage() . "\n";
}
);
$promise->wait();
上面的代碼使用requestAsync方法發送了一個非同步請求,並在接收到響應後輸出響應狀態碼。
六、中間件
中間件可以在請求發送前後對請求和響應進行處理,GuzzleHttp支持PSR-7中間件規範,可以使用Middleware提供的各種中間件,或者自定義中間件實現一些自己的處理邏輯。
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use Psr\Http\Message\RequestInterface;
$stack = new HandlerStack();
$stack->setHandler(\GuzzleHttp\choose_handler());
$stack->push(Middleware::mapRequest(function (RequestInterface $request) {
return $request->withHeader('X-Requested-With', 'XMLHttpRequest');
}));
$client = new Client(['handler' => $stack]);
$res = $client->request('GET', 'https://api.github.com/');
上面的代碼使用Middleware::mapRequest方法在請求頭添加了一個X-Requested-With的頭部,並發送了一個GET請求到Github API。你也可以使用Middleware::mapResponse方法對響應進行處理。
七、連接池和性能
GuzzleHttp使用連接池共享連接資源來提高請求性能。默認情況下,GuzzleHttp會自動管理連接池。你也可以手動控制連接池的行為,包括最大連接數、等待時間等。
use GuzzleHttp\Pool;
$client = new Client();
$requests = function ($total) use ($client) {
$uri = 'https://httpbin.org/get';
for ($i = 0; $i getAsync($uri);
};
}
};
$pool = new Pool($client, $requests(10), [
'concurrency' => 5,
'fulfilled' => function ($response, $index) {
// 處理請求成功的響應
},
'rejected' => function ($reason, $index) {
// 處理請求失敗的原因
},
]);
$pool->promise()->wait();
上面的代碼使用Pool類發送了10個GET請求,並設置並發請求數為5個。通過Promise機制處理所有響應(成功或失敗)。這種方式可以一次發送多個請求,大大提升性能。
八、異常處理
GuzzleHttp提供了詳細的異常處理機制,可以在出現異常時進行有效的處理。例如:
use GuzzleHttp\Exception\RequestException;
try {
$res = $client->request('GET', 'https://null');
} catch (RequestException $e) {
echo $e->getRequest()->getMethod();
if ($e->hasResponse()) {
echo $e->getResponse()->getStatusCode();
}
}
上面的代碼中,當請求函數拋出RequestException異常時,可以捕獲該異常,並使用getRequest()和hasResponse()方法獲取請求和響應對象。
九、總結
GuzzleHttp是一個功能強大的PHP HTTP客戶端,可以輕鬆地發送HTTP請求和處理響應。它提供了豐富的配置、非同步請求和中間件支持,可以滿足各種HTTP請求的需求。在使用GuzzleHttp時,需要注意合理使用連接池、處理異常和提高性能等方面。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/229274.html