カテゴリー: BackEnd

LaravelのHttp Facade

はじめに

現在関わっている案件でHttpクライアントライブラリのGuzzleHttpを利用してHttp通信する事がありました。

Laravelではこれを楽に実装出来てしまうHttp Facadeが用意されてあったので、こちらを紹介したいと思います。

Http Facadeは、Laravel7.から導入されたHttpクライアント機能で、内部ではGuzzleHttpを使用しています。GuzzleHttpのラッパーとなっています。

GuzzleHttpの参考:LaravelでHTTP通信

基本定な使い方

http通信ではこちらこちらを利用させてもらっています。

get

URLの指定のみで使用可能。Illuminate\Http\Client\Responseインスタンスが返却される為、レスポンスがJSONであれば配列にパースする事が可能です。

use Illuminate\Support\Facades\Http; 

  $response = Http::get('http://httpbin.org/get');
  $body = $response->body(); // レスポンスのbody部分の取得
  $json = $response->json(); // 配列にパース

クエリパラメーターを付ける場合は、第二引数に連想配列で設定する事が出来ます。

  // 第二引数にクエリパラメーターを付与できる
  $response = Http::get('http://httpbin.org/get', [
      'query1' => 'sample'
  ]);

post

第二引数に送信データを連想配列で設定する事が出来ます。

  $response = Http::post('http://httpbin.org/post', [
      'data1' => 'sample1',
      'data2' => 'sample2'
  ]);
 $body = $response->body(); // bodyの取得
 $json = $response->json(); // 配列にパース

また、デフォルトはContent-type: application/jsonになりますが、asForm()を付けると
Content-type: application/x-www-form-urlencodedにしてPOSTする事が出来ます。

  // Http::asForm()を付ける
  $response = Http::asForm()->post('http://httpbin.org/post', [
      'data1' => 'sample1',
      'data2' => 'sample2'
  ]);

タイムアウト

timeout()メソッドで秒単位でタイムアウト設定をする事が出来ます。
指定秒数を超えるとIlluminate\Http\Client\ConnectionExceptionが投げられます。

  $response = Http::timeout(1)->get('http://httpbin.org/get', [
      'query1' => 'sample'
  ]);

リトライ

クライアントまたはサーバーのエラーが発生した場合に、再度リクエストを行いたい場合はretry()メソッドが使用出来ます。

第一引数にリトライ試行回数、第二引数にリトライ間隔をミリ秒数で指定します。リクエストが全て失敗した場合、Illuminate\Http\Client\RequestExceptionが投げられます。

  $response = Http::retry(3, 100)->get('http://httpbin.org/get', [
      'query1' => 'sample'
  ]);

マルチパートリクエスト

ファイル送信などしたい場合は、attach()メソッドが使用出来ます。

第二引数にファイル内容と第三引数にファイル名を指定出来ます。

  $response = Http::attach('attachment', file_get_contents('Sample.jpg'), 'Sample.jpg')
      ->post('http://httpbin.org/post', [
          'data1' => 'test1',
          'data2' => 'test2'
      ]);

ファイルを複数送りたい場合は、attach()メソッドをつないで送る事が出来る様です。

  $response = Http::attach('attachment1', file_get_contents('Sample.jpg'), 'Sample.jpg')
      ->attach('attachment2', file_get_contents('Sample.jpg'), 'Sample.jpg')
      ->post('http://httpbin.org/post', [
          'data1' => 'test1',
          'data2' => 'test2'
      ]);

エラー処理

GuzzleHttpと異なり、エラー(ステータスコード400 ~ 500)時に例外が投げられません。

その為、try ~ catchで囲まずに、用意されてある返却結果の判定メソッドで処理分けする事が出来ます。

細かく判定出来るので、それぞれの処理分けを簡単に行う事が出来ます。

 // エラーが返却される(404など)
  $response = Http::get('http://url/error');

  // レスポンス判定のメソッド。ステータスコードにより判定可能。
  if ($response->ok()) {
      // ステータスコードが200
  }
  if ($response->redirect()) {
      // ステータスコードが300~399
  }
  if ($response->clientError()) {
     // ステータスコードが400~499
  }
  if ($response->serverError()) {
     // ステータスコードが500
  }
  if ($response->successful()) {
     // ステータスコードが200~299
  }
  if ($response->failed()) {
     // ステータスコードが400~500
  }

Exceptionを投げたい場合はthrow()メソッドが使用出来ます。

これは、エラー発生時にはIlluminate\Http\Client\RequestExceptionを投げて、通常時はレスポンスインスタンスを返却します。

  // 通常時はレスポンスインスタンスが返却されるので、メソッドチェーンで繋げられます。
  $response = Http::get('http://httpbin.org/get')->throw()->json(); // レスポンスが配列にパースされる

  // RequestExceptionが投げられます
  $response = Http::get('http://url/error')->throw();

さいごに

Httpファサードを利用すると簡潔にHttp通信処理が実装出来そうです。

今の現場ではLaravelバージョンが7.未満で使えませんが、機会があれば是非利用したい機能だと思いました。

おすすめ書籍

Yossy

シェア
執筆者:
Yossy
タグ: phplaravel

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前