HTTPクライアントとは
LaravelのHTTPクライアントは、Guzzle をラップした使いやすいAPIです。Http ファサードを通じて、外部のWebサービスやAPIへのHTTPリクエストを簡潔に記述できます。
Guzzleは事前にインストールされているため、追加の設定なしにすぐ使い始められます。
基本的なリクエスト
GETリクエスト
POSTリクエスト
データはデフォルトでapplication/json として送信されます。
PUT / PATCH / DELETE
レスポンスの処理
Http::get() などのメソッドは Illuminate\Http\Client\Response インスタンスを返します。
このオブジェクトにはレスポンスを検査するための多数のメソッドが用意されています。
JSONデコードのオプション
json()の第2引数にJSONデコードフラグを渡せます。無効なJSONを例外として扱う場合は、PHPのJSON_THROW_ON_ERRORを指定します。
リクエストオプション
ヘッダーの設定
application/json を受け入れることを示す場合は acceptJson() が便利です。
ブラウザーからLaravelへ送るAJAXリクエストのCSRFヘッダー(
X-CSRF-TOKEN / X-XSRF-TOKEN)については CSRFプロテクション を参照してください。認証
Bearer トークン認証(最も一般的):ベースURLの設定
同じホストへのリクエストが多い場合、baseUrl() でまとめられます。
フォームデータの送信
application/x-www-form-urlencoded で送信したい場合は asForm() を使います。
タイムアウト
リトライ
一時的なネットワーク障害やサーバーエラーに対して、自動リトライを設定できます。エラーハンドリング
手動でエラーを確認する
LaravelのHTTPクライアントは、デフォルトでは400・500番台のレスポンスに対して例外をスローしません。failed() や clientError() などで明示的に確認します。
例外をスローする
throw() を使うと、エラー時に Illuminate\Http\Client\RequestException をスローします。
throw() はレスポンスインスタンスを返すため、メソッドチェーンで書けます。
並行リクエスト
複数のAPIを同時に呼び出したい場合、pool() で並行実行できます。
テスト
Http::fake() によるモック
テストではHttp::fake() を使って実際のHTTPリクエストを送らずにレスポンスをシミュレートします。
リクエストの検証
Http::assertSent() でリクエストの内容を検証できます。
Strayリクエストの防止
実践例: 外部APIを呼び出すサービスクラス
実際のプロジェクトでは、HTTPクライアントのロジックをサービスクラスにまとめるのがベストプラクティスです。1
サービスクラスを作成する
2
サービスプロバイダーで登録する
3
コントローラーから利用する
4
テストを書く
まとめ
よく使うメソッド一覧
よく使うメソッド一覧
レスポンス判定メソッド一覧
レスポンス判定メソッド一覧
外部API連携のベストプラクティス
外部API連携のベストプラクティス
- HTTPクライアントのロジックはサービスクラスにまとめる
- 必ずタイムアウトを設定する(
timeout()とconnectTimeout()) - 一時的な障害に対してリトライを設定する(
retry()) - テストでは
Http::fake()を必ず使用し、外部APIを実際に叩かない Http::preventStrayRequests()をテストのセットアップに加えると安心- APIのトークンや認証情報は環境変数と
config/services.phpで管理する