はじめに
現在関わっている案件でHttpクライアントライブラリのGuzzleHttpを利用してHttp通信する事がありました。
Laravelではこれを楽に実装出来てしまうHttp Facadeが用意されてあったので、こちらを紹介したいと思います。
Http Facadeは、Laravel7.から導入されたHttpクライアント機能で、内部ではGuzzleHttpを使用しています。GuzzleHttpのラッパーとなっています。
GuzzleHttpの参考:LaravelでHTTP通信
基本定な使い方
http通信ではこちらこちらを利用させてもらっています。
get
URLの指定のみで使用可能。
Illuminate\Http\Client\Response
インスタンスが返却される為、レスポンスがJSONであれば配列にパースする事が可能です。
1 2 3 4 5 | use Illuminate\Support\Facades\Http; $response = Http::get('http://httpbin.org/get'); $body = $response->body(); // レスポンスのbody部分の取得 $json = $response->json(); // 配列にパース |
クエリパラメーターを付ける場合は、第二引数に連想配列で設定する事が出来ます。
1 2 3 4 | // 第二引数にクエリパラメーターを付与できる $response = Http::get('http://httpbin.org/get', [ 'query1' => 'sample' ]); |
post
第二引数に送信データを連想配列で設定する事が出来ます。
1 2 3 4 5 6 | $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する事が出来ます。
1 2 3 4 5 | // Http::asForm()を付ける $response = Http::asForm()->post('http://httpbin.org/post', [ 'data1' => 'sample1', 'data2' => 'sample2' ]); |
タイムアウト
timeout()
メソッドで秒単位でタイムアウト設定をする事が出来ます。
指定秒数を超えると
Illuminate\Http\Client\ConnectionException
が投げられます。
1 2 3 | $response = Http::timeout(1)->get('http://httpbin.org/get', [ 'query1' => 'sample' ]); |
リトライ
クライアントまたはサーバーのエラーが発生した場合に、再度リクエストを行いたい場合は
retry()
メソッドが使用出来ます。
第一引数にリトライ試行回数、第二引数にリトライ間隔をミリ秒数で指定します。リクエストが全て失敗した場合、
Illuminate\Http\Client\RequestException
が投げられます。
1 2 3 | $response = Http::retry(3, 100)->get('http://httpbin.org/get', [ 'query1' => 'sample' ]); |
マルチパートリクエスト
ファイル送信などしたい場合は、
attach()
メソッドが使用出来ます。
第二引数にファイル内容と第三引数にファイル名を指定出来ます。
1 2 3 4 5 | $response = Http::attach('attachment', file_get_contents('Sample.jpg'), 'Sample.jpg') ->post('http://httpbin.org/post', [ 'data1' => 'test1', 'data2' => 'test2' ]); |
ファイルを複数送りたい場合は、
attach()
メソッドをつないで送る事が出来る様です。
1 2 3 4 5 6 | $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
で囲まずに、用意されてある返却結果の判定メソッドで処理分けする事が出来ます。
細かく判定出来るので、それぞれの処理分けを簡単に行う事が出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // エラーが返却される(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
を投げて、通常時はレスポンスインスタンスを返却します。
1 2 3 4 5 | // 通常時はレスポンスインスタンスが返却されるので、メソッドチェーンで繋げられます。 $response = Http::get('http://httpbin.org/get')->throw()->json(); // レスポンスが配列にパースされる // RequestExceptionが投げられます $response = Http::get('http://url/error')->throw(); |
さいごに
Httpファサードを利用すると簡潔にHttp通信処理が実装出来そうです。
今の現場ではLaravelバージョンが7.未満で使えませんが、機会があれば是非利用したい機能だと思いました。