PHPプロジェクトで外部APIと通信する際、Guzzleは強力かつ柔軟なHTTPクライアントとして広く利用されています。まずは、Composerを使用してライブラリをプロジェクトに導入します。
composer require guzzlehttp/guzzle
非同期リクエストによる並列処理
PHPの標準的な同期処理では、複数のHTTPリクエストを順次実行するため、全体の待機時間が長くなりがちです。Guzzleの非同期機能を活用することで、複数のリクエストを並列に実行し、ネットワークI/Oの待機時間を大幅に短縮できます。
Guzzleでは、Promiseオブジェクトを利用して非同期操作を管理します。以下の例では、異なるエンドポイントに対して同時にGETリクエストを送信し、すべての応答を待機する処理を示しています。
$httpClient = new \GuzzleHttp\Client();
$fetchUsersPromise = $httpClient->getAsync('https://jsonplaceholder.typicode.com/users');
$fetchPostsPromise = $httpClient->getAsync('https://jsonplaceholder.typicode.com/posts');
$promises = [
'users' => $fetchUsersPromise,
'posts' => $fetchPostsPromise,
];
// すべてのPromiseが解決または拒否されるまで待機
$results = \GuzzleHttp\Promise\Utils::settle($promises)->wait();
foreach ($results as $key => $result) {
if ($result['state'] === 'fulfilled') {
$response = $result['value'];
$statusCode = $response->getStatusCode();
// 各レスポンスの処理
} else {
$exception = $result['reason'];
// エラーハンドリング
}
}
Utils::settle()メソッド(Guzzle 7以降の推奨メソッド)は、連想配列として渡されたPromiseがすべて完了するまで待機し、各リクエストの状態(fulfilledまたはrejected)と結果を含む配列を返します。これにより、一部のリクエストが失敗した場合でも、他の成功したリクエストの結果を安全に取得できます。
API認証メカニズムの適用
保護されたAPIエンドポイントにアクセスする際は、適切な認証情報の付与が必須です。Guzzleは、リクエストオプションを通じて様々な認証スキームを簡単に実装できるよう設計されています。
最も一般的なBasic認証は、authオプションに認証情報を配列として渡すことで、自動的に適切なAuthorizationヘッダーが生成されます。
$apiClient = new \GuzzleHttp\Client([
'base_uri' => 'https://api.example.com/v1/',
'timeout' => 5.0,
]);
$apiResponse = $apiClient->request('GET', 'secure-profile', [
'auth' => ['api_username', 'api_secret_key', 'basic'],
'headers' => [
'Accept' => 'application/json',
'X-Custom-Header' => 'CustomValue',
],
]);
$profileData = json_decode($apiResponse->getBody()->getContents(), true);
上記のコードでは、auth配列の3番目の要素としてbasicを明示的に指定しています。これを省略した場合でもデフォルトでBasic認証が適用されますが、明示的に記述することでコードの可読性が向上します。
GuzzleはBasic認証のほか、Digest認証もネイティブでサポートしています。また、OAuth 1.0やOAuth 2.0、AWS Signature、Bearerトークンなどのより複雑な認証プロトコルについては、ミドルウェアやサードパーティパッケージを組み合わせることで対応可能です。接続先のAPIが要求するセキュリティ要件に合わせて、最適な認証メソッドを選択し、リクエストオプションに組み込むことが重要です。