HTTPクライアント
はじめに
Laravelは、Guzzle HTTPクライアントを中心に、表現豊かで最小限のAPIを提供しており、他のWebアプリケーションと通信するために、迅速に送信HTTPリクエストを作成できます。LaravelのGuzzleのラッパーは、最も一般的なユースケースと優れた開発者エクスペリエンスに焦点を当てています。
リクエストの作成
リクエストを作成するには、Http
ファサードによって提供されるhead
、get
、post
、put
、patch
、およびdelete
メソッドを使用できます。まず、別のURLに基本的なGET
リクエストを作成する方法を見てみましょう。
use Illuminate\Support\Facades\Http; $response = Http::get('http://example.com');
get
メソッドは、Illuminate\Http\Client\Response
のインスタンスを返し、レスポンスを検査するために使用できるさまざまなメソッドを提供します。
$response->body() : string;$response->json($key = null, $default = null) : mixed;$response->object() : object;$response->collect($key = null) : Illuminate\Support\Collection;$response->resource() : resource;$response->status() : int;$response->successful() : bool;$response->redirect(): bool;$response->failed() : bool;$response->clientError() : bool;$response->header($header) : string;$response->headers() : array;
Illuminate\Http\Client\Response
オブジェクトは、PHPのArrayAccess
インターフェイスも実装しているため、レスポンスのJSONデータをレスポンスで直接アクセスできます。
return Http::get('http://example.com/users/1')['name'];
上記にリストされているレスポンスメソッドに加えて、次のメソッドを使用して、レスポンスに特定のステータスコードがあるかどうかを判断できます。
$response->ok() : bool; // 200 OK$response->created() : bool; // 201 Created$response->accepted() : bool; // 202 Accepted$response->noContent() : bool; // 204 No Content$response->movedPermanently() : bool; // 301 Moved Permanently$response->found() : bool; // 302 Found$response->badRequest() : bool; // 400 Bad Request$response->unauthorized() : bool; // 401 Unauthorized$response->paymentRequired() : bool; // 402 Payment Required$response->forbidden() : bool; // 403 Forbidden$response->notFound() : bool; // 404 Not Found$response->requestTimeout() : bool; // 408 Request Timeout$response->conflict() : bool; // 409 Conflict$response->unprocessableEntity() : bool; // 422 Unprocessable Entity$response->tooManyRequests() : bool; // 429 Too Many Requests$response->serverError() : bool; // 500 Internal Server Error
URIテンプレート
HTTPクライアントを使用すると、URIテンプレート仕様を使用してリクエストURLを構築することもできます。URIテンプレートで展開できるURLパラメーターを定義するには、withUrlParameters
メソッドを使用できます。
Http::withUrlParameters([ 'endpoint' => 'https://laravel.dokyumento.jp', 'page' => 'docs', 'version' => '11.x', 'topic' => 'validation',])->get('{+endpoint}/{page}/{version}/{topic}');
リクエストのダンプ
送信リクエストインスタンスを送信する前にダンプして、スクリプトの実行を終了する場合は、リクエスト定義の先頭にdd
メソッドを追加できます。
return Http::dd()->get('http://example.com');
リクエストデータ
もちろん、POST
、PUT
、およびPATCH
リクエストを作成するときに、リクエストと共に追加のデータを送信するのが一般的であるため、これらのメソッドは2番目の引数としてデータの配列を受け入れます。デフォルトでは、データはapplication/json
コンテンツタイプを使用して送信されます。
use Illuminate\Support\Facades\Http; $response = Http::post('http://example.com/users', [ 'name' => 'Steve', 'role' => 'Network Administrator',]);
GETリクエストクエリパラメーター
GET
リクエストを作成する場合、クエリ文字列をURLに直接追加するか、get
メソッドの2番目の引数としてキー/値ペアの配列を渡すことができます。
$response = Http::get('http://example.com/users', [ 'name' => 'Taylor', 'page' => 1,]);
または、withQueryParameters
メソッドを使用することもできます。
Http::retry(3, 100)->withQueryParameters([ 'name' => 'Taylor', 'page' => 1,])->get('http://example.com/users')
フォームURLエンコードされたリクエストの送信
application/x-www-form-urlencoded
コンテンツタイプを使用してデータを送信する場合は、リクエストを行う前にasForm
メソッドを呼び出す必要があります。
$response = Http::asForm()->post('http://example.com/users', [ 'name' => 'Sara', 'role' => 'Privacy Consultant',]);
生のリクエストボディの送信
リクエストを行うときに生のリクエストボディを提供する場合は、withBody
メソッドを使用できます。コンテンツタイプは、メソッドの2番目の引数を介して提供できます。
$response = Http::withBody( base64_encode($photo), 'image/jpeg')->post('http://example.com/photo');
マルチパートリクエスト
ファイルをマルチパートリクエストとして送信する場合は、リクエストを行う前にattach
メソッドを呼び出す必要があります。このメソッドは、ファイルの名前とその内容を受け入れます。必要に応じて、ファイルのファイル名と見なされる3番目の引数を提供できます。4番目の引数を使用して、ファイルに関連付けられたヘッダーを提供できます。
$response = Http::attach( 'attachment', file_get_contents('photo.jpg'), 'photo.jpg', ['Content-Type' => 'image/jpeg'])->post('http://example.com/attachments');
ファイルの生の内容を渡す代わりに、ストリームリソースを渡すことができます。
$photo = fopen('photo.jpg', 'r'); $response = Http::attach( 'attachment', $photo, 'photo.jpg')->post('http://example.com/attachments');
ヘッダー
withHeaders
メソッドを使用して、リクエストにヘッダーを追加できます。このwithHeaders
メソッドは、キー/値ペアの配列を受け入れます。
$response = Http::withHeaders([ 'X-First' => 'foo', 'X-Second' => 'bar'])->post('http://example.com/users', [ 'name' => 'Taylor',]);
accept
メソッドを使用すると、アプリケーションがリクエストに応じて期待するコンテンツタイプを指定できます。
$response = Http::accept('application/json')->get('http://example.com/users');
便宜上、acceptJson
メソッドを使用すると、アプリケーションがリクエストに応じてapplication/json
コンテンツタイプを期待することをすばやく指定できます。
$response = Http::acceptJson()->get('http://example.com/users');
withHeaders
メソッドは、新しいヘッダーをリクエストの既存のヘッダーにマージします。必要に応じて、replaceHeaders
メソッドを使用してすべてのヘッダーを完全に置き換えることができます。
$response = Http::withHeaders([ 'X-Original' => 'foo',])->replaceHeaders([ 'X-Replacement' => 'bar',])->post('http://example.com/users', [ 'name' => 'Taylor',]);
認証
withBasicAuth
およびwithDigestAuth
メソッドをそれぞれ使用して、基本認証およびダイジェスト認証の資格情報を指定できます。
// Basic authentication... // Digest authentication...
ベアラートークン
リクエストのAuthorization
ヘッダーにベアラートークンをすばやく追加する場合は、withToken
メソッドを使用できます。
$response = Http::withToken('token')->post(/* ... */);
タイムアウト
timeout
メソッドを使用すると、レスポンスを待機する最大秒数を指定できます。デフォルトでは、HTTPクライアントは30秒後にタイムアウトします。
$response = Http::timeout(3)->get(/* ... */);
指定されたタイムアウトを超えると、Illuminate\Http\Client\ConnectionException
のインスタンスがスローされます。
connectTimeout
メソッドを使用して、サーバーへの接続を試行する際に待機する最大秒数を指定できます。
$response = Http::connectTimeout(3)->get(/* ... */);
リトライ
クライアントまたはサーバーエラーが発生した場合に、HTTPクライアントにリクエストを自動的に再試行させる場合は、retry
メソッドを使用できます。retry
メソッドは、リクエストを試行する最大回数と、Laravelが試行間隔で待機する必要があるミリ秒数を受け入れます。
$response = Http::retry(3, 100)->post(/* ... */);
試行間隔でスリープするミリ秒数を手動で計算する場合は、retry
メソッドの2番目の引数としてクロージャーを渡すことができます。
use Exception; $response = Http::retry(3, function (int $attempt, Exception $exception) { return $attempt * 100;})->post(/* ... */);
便宜上、retry
メソッドの最初の引数として配列を提供することもできます。この配列は、後続の試行間隔でスリープするミリ秒数を決定するために使用されます。
$response = Http::retry([100, 200])->post(/* ... */);
必要に応じて、retry
メソッドに3番目の引数を渡すことができます。3番目の引数は、再試行を実際に試行するかどうかを決定するcallableである必要があります。たとえば、最初のリクエストでConnectionException
が発生した場合にのみリクエストを再試行したい場合があります。
use Exception;use Illuminate\Http\Client\PendingRequest; $response = Http::retry(3, 100, function (Exception $exception, PendingRequest $request) { return $exception instanceof ConnectionException;})->post(/* ... */);
リクエストの試行が失敗した場合、新しい試行が行われる前にリクエストを変更したい場合があります。これは、retry
メソッドに提供したcallableに提供されたリクエスト引数を変更することで実現できます。たとえば、最初の試行で認証エラーが返された場合は、新しい認証トークンを使用してリクエストを再試行できます。
use Exception;use Illuminate\Http\Client\PendingRequest;use Illuminate\Http\Client\RequestException; $response = Http::withToken($this->getToken())->retry(2, 0, function (Exception $exception, PendingRequest $request) { if (! $exception instanceof RequestException || $exception->response->status() !== 401) { return false; } $request->withToken($this->getNewToken()); return true;})->post(/* ... */);
すべてのリクエストが失敗した場合、Illuminate\Http\Client\RequestException
のインスタンスがスローされます。この動作を無効にする場合は、値がfalse
のthrow
引数を指定できます。無効にすると、すべての再試行が試行された後、クライアントが受信した最後のレスポンスが返されます。
$response = Http::retry(3, 100, throw: false)->post(/* ... */);
接続の問題が原因ですべてのリクエストが失敗した場合、throw
引数がfalse
に設定されていても、Illuminate\Http\Client\ConnectionException
がスローされます。
エラーハンドリング
Guzzleのデフォルトの動作とは異なり、LaravelのHTTPクライアントラッパーは、クライアントまたはサーバーエラー(サーバーからの400
および500
レベルのレスポンス)で例外をスローしません。これらのエラーのいずれかが返されたかどうかを判断するには、successful
、clientError
、またはserverError
メソッドを使用できます。
// Determine if the status code is >= 200 and < 300...$response->successful(); // Determine if the status code is >= 400...$response->failed(); // Determine if the response has a 400 level status code...$response->clientError(); // Determine if the response has a 500 level status code...$response->serverError(); // Immediately execute the given callback if there was a client or server error...$response->onError(callable $callback);
例外をスローする
レスポンスインスタンスがあり、レスポンスステータスコードがクライアントまたはサーバーエラーを示している場合に、Illuminate\Http\Client\RequestException
のインスタンスをスローする場合は、throw
またはthrowIf
メソッドを使用できます。
use Illuminate\Http\Client\Response; $response = Http::post(/* ... */); // Throw an exception if a client or server error occurred...$response->throw(); // Throw an exception if an error occurred and the given condition is true...$response->throwIf($condition); // Throw an exception if an error occurred and the given closure resolves to true...$response->throwIf(fn (Response $response) => true); // Throw an exception if an error occurred and the given condition is false...$response->throwUnless($condition); // Throw an exception if an error occurred and the given closure resolves to false...$response->throwUnless(fn (Response $response) => false); // Throw an exception if the response has a specific status code...$response->throwIfStatus(403); // Throw an exception unless the response has a specific status code...$response->throwUnlessStatus(200); return $response['user']['id'];
Illuminate\Http\Client\RequestException
インスタンスには、返されたレスポンスを検査できるパブリック$response
プロパティがあります。
エラーが発生しなかった場合、throw
メソッドはレスポンスインスタンスを返し、throw
メソッドに他の操作をチェーンできます。
return Http::post(/* ... */)->throw()->json();
例外がスローされる前に追加のロジックを実行する場合は、クロージャーをthrow
メソッドに渡すことができます。クロージャーが呼び出された後、例外は自動的にスローされるため、クロージャー内から例外を再スローする必要はありません。
use Illuminate\Http\Client\Response;use Illuminate\Http\Client\RequestException; return Http::post(/* ... */)->throw(function (Response $response, RequestException $e) { // ...})->json();
デフォルトでは、RequestException
メッセージはログに記録されたり報告されたりする際に120文字に切り捨てられます。この挙動をカスタマイズまたは無効にするには、bootstrap/app.php
ファイルでアプリケーションの例外処理の挙動を設定する際に、truncateRequestExceptionsAt
および dontTruncateRequestExceptions
メソッドを利用できます。
->withExceptions(function (Exceptions $exceptions) { // Truncate request exception messages to 240 characters... $exceptions->truncateRequestExceptionsAt(240); // Disable request exception message truncation... $exceptions->dontTruncateRequestExceptions();})
Guzzleミドルウェア
LaravelのHTTPクライアントはGuzzleによって動作しているため、Guzzleミドルウェアを利用して、送信リクエストを操作したり、受信レスポンスを検査したりできます。送信リクエストを操作するには、withRequestMiddleware
メソッドを使用してGuzzleミドルウェアを登録します。
use Illuminate\Support\Facades\Http;use Psr\Http\Message\RequestInterface; $response = Http::withRequestMiddleware( function (RequestInterface $request) { return $request->withHeader('X-Example', 'Value'); })->get('http://example.com');
同様に、withResponseMiddleware
メソッドを使用してミドルウェアを登録することで、受信HTTPレスポンスを検査できます。
use Illuminate\Support\Facades\Http;use Psr\Http\Message\ResponseInterface; $response = Http::withResponseMiddleware( function (ResponseInterface $response) { $header = $response->getHeader('X-Example'); // ... return $response; })->get('http://example.com');
グローバルミドルウェア
場合によっては、すべての送信リクエストと受信レスポンスに適用されるミドルウェアを登録したい場合があります。これを実現するには、globalRequestMiddleware
および globalResponseMiddleware
メソッドを使用します。通常、これらのメソッドはアプリケーションの AppServiceProvider
の boot
メソッドで呼び出す必要があります。
use Illuminate\Support\Facades\Http; Http::globalRequestMiddleware(fn ($request) => $request->withHeader( 'User-Agent', 'Example Application/1.0')); Http::globalResponseMiddleware(fn ($response) => $response->withHeader( 'X-Finished-At', now()->toDateTimeString()));
Guzzleオプション
withOptions
メソッドを使用して、送信リクエストに対して追加の Guzzleリクエストオプション を指定できます。withOptions
メソッドはキーと値のペアの配列を受け入れます。
$response = Http::withOptions([ 'debug' => true,])->get('http://example.com/users');
グローバルオプション
すべての送信リクエストに対するデフォルトオプションを設定するには、globalOptions
メソッドを利用できます。通常、このメソッドはアプリケーションの AppServiceProvider
の boot
メソッドから呼び出す必要があります。
use Illuminate\Support\Facades\Http; /** * Bootstrap any application services. */public function boot(): void{ Http::globalOptions([ 'allow_redirects' => false, ]);}
並列リクエスト
場合によっては、複数のHTTPリクエストを同時に実行したい場合があります。つまり、リクエストを順番に発行するのではなく、複数のリクエストを同時にディスパッチしたいということです。これは、遅いHTTP APIとやり取りする場合に大幅なパフォーマンス向上につながる可能性があります。
ありがたいことに、pool
メソッドを使用してこれを実現できます。pool
メソッドは、Illuminate\Http\Client\Pool
インスタンスを受け取るクロージャを受け入れ、リクエストをディスパッチするためのリクエストプールに簡単に追加できるようにします。
use Illuminate\Http\Client\Pool;use Illuminate\Support\Facades\Http; $responses = Http::pool(fn (Pool $pool) => [ $pool->get('http://localhost/first'), $pool->get('http://localhost/second'), $pool->get('http://localhost/third'),]); return $responses[0]->ok() && $responses[1]->ok() && $responses[2]->ok();
ご覧のとおり、各レスポンスインスタンスは、プールに追加された順序に基づいてアクセスできます。必要に応じて、as
メソッドを使用してリクエストに名前を付けると、対応するレスポンスを名前でアクセスできます。
use Illuminate\Http\Client\Pool;use Illuminate\Support\Facades\Http; $responses = Http::pool(fn (Pool $pool) => [ $pool->as('first')->get('http://localhost/first'), $pool->as('second')->get('http://localhost/second'), $pool->as('third')->get('http://localhost/third'),]); return $responses['first']->ok();
同時リクエストのカスタマイズ
pool
メソッドは、withHeaders
や middleware
メソッドなどの他のHTTPクライアントメソッドとチェーンできません。プールされたリクエストにカスタムヘッダーまたはミドルウェアを適用する場合は、プール内の各リクエストでこれらのオプションを設定する必要があります。
use Illuminate\Http\Client\Pool;use Illuminate\Support\Facades\Http; $headers = [ 'X-Example' => 'example',]; $responses = Http::pool(fn (Pool $pool) => [ $pool->withHeaders($headers)->get('http://laravel.test/test'), $pool->withHeaders($headers)->get('http://laravel.test/test'), $pool->withHeaders($headers)->get('http://laravel.test/test'),]);
マクロ
Laravel HTTPクライアントを使用すると、「マクロ」を定義できます。これは、アプリケーション全体でサービスとやり取りする際に、共通のリクエストパスとヘッダーを設定するための、流暢で表現力豊かなメカニズムとして機能します。まず、アプリケーションの App\Providers\AppServiceProvider
クラスの boot
メソッド内でマクロを定義できます。
use Illuminate\Support\Facades\Http; /** * Bootstrap any application services. */public function boot(): void{ Http::macro('github', function () { return Http::withHeaders([ 'X-Example' => 'example', ])->baseUrl('https://github.com'); });}
マクロを設定したら、アプリケーションのどこからでも呼び出して、指定した構成で保留中のリクエストを作成できます。
$response = Http::github()->get('/');
テスト
多くのLaravelサービスは、テストを簡単かつ表現力豊かに記述するのに役立つ機能を提供しており、LaravelのHTTPクライアントも例外ではありません。Http
ファサードの fake
メソッドを使用すると、リクエストが作成されたときにHTTPクライアントにスタブ/ダミーレスポンスを返すように指示できます。
レスポンスの偽装
たとえば、すべてのリクエストに対して空の 200
ステータスコードレスポンスを返すようにHTTPクライアントに指示するには、引数なしで fake
メソッドを呼び出すことができます。
use Illuminate\Support\Facades\Http; Http::fake(); $response = Http::post(/* ... */);
特定のURLの偽装
または、fake
メソッドに配列を渡すこともできます。配列のキーは、偽装したいURLパターンとそれに関連付けられたレスポンスを表す必要があります。*
文字はワイルドカード文字として使用できます。偽装されていないURLに対して行われたリクエストは、実際に実行されます。Http
ファサードの response
メソッドを使用して、これらのエンドポイント用のスタブ/偽のレスポンスを作成できます。
Http::fake([ // Stub a JSON response for GitHub endpoints... 'github.com/*' => Http::response(['foo' => 'bar'], 200, $headers), // Stub a string response for Google endpoints... 'google.com/*' => Http::response('Hello World', 200, $headers),]);
一致しないすべてのURLをスタブするフォールバックURLパターンを指定する場合は、単一の *
文字を使用できます。
Http::fake([ // Stub a JSON response for GitHub endpoints... 'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']), // Stub a string response for all other endpoints... '*' => Http::response('Hello World', 200, ['Headers']),]);
便宜上、単純な文字列、JSON、および空のレスポンスは、レスポンスとして文字列、配列、または整数を提供することで生成できます。
Http::fake([ 'google.com/*' => 'Hello World', 'github.com/*' => ['foo' => 'bar'], 'chatgpt.com/*' => 200,]);
接続例外の偽装
場合によっては、HTTPクライアントがリクエストを作成しようとしたときに Illuminate\Http\Client\ConnectionException
に遭遇した場合に、アプリケーションの動作をテストする必要がある場合があります。failedConnection
メソッドを使用して、HTTPクライアントに接続例外をスローするように指示できます。
Http::fake([ 'github.com/*' => Http::failedConnection(),]);
レスポンスシーケンスの偽装
場合によっては、単一のURLが特定の順序で一連の偽のレスポンスを返すように指定する必要がある場合があります。Http::sequence
メソッドを使用してレスポンスを作成することにより、これを実現できます。
Http::fake([ // Stub a series of responses for GitHub endpoints... 'github.com/*' => Http::sequence() ->push('Hello World', 200) ->push(['foo' => 'bar'], 200) ->pushStatus(404),]);
レスポンスシーケンス内のすべてのレスポンスが消費されると、それ以降のリクエストによってレスポンスシーケンスが例外をスローします。シーケンスが空の場合に返す必要があるデフォルトのレスポンスを指定する場合は、whenEmpty
メソッドを使用できます。
Http::fake([ // Stub a series of responses for GitHub endpoints... 'github.com/*' => Http::sequence() ->push('Hello World', 200) ->push(['foo' => 'bar'], 200) ->whenEmpty(Http::response()),]);
一連のレスポンスを偽装したいが、偽装する必要がある特定のURLパターンを指定する必要がない場合は、Http::fakeSequence
メソッドを使用できます。
Http::fakeSequence() ->push('Hello World', 200) ->whenEmpty(Http::response());
偽装コールバック
特定のエンドポイントに対して返すレスポンスを決定するために、より複雑なロジックが必要な場合は、クロージャを fake
メソッドに渡すことができます。このクロージャは Illuminate\Http\Client\Request
のインスタンスを受け取り、レスポンスインスタンスを返す必要があります。クロージャ内で、どのタイプのレスポンスを返すかを決定するために必要なロジックを実行できます。
use Illuminate\Http\Client\Request; Http::fake(function (Request $request) { return Http::response('Hello World', 200);});
迷子のリクエストの防止
個々のテストまたは完全なテストスイート全体で、HTTPクライアントを介して送信されたすべてのリクエストが偽装されていることを確認したい場合は、preventStrayRequests
メソッドを呼び出すことができます。このメソッドを呼び出した後、対応する偽のレスポンスがないリクエストは、実際 のHTTPリクエストを行うのではなく、例外をスローします。
use Illuminate\Support\Facades\Http; Http::preventStrayRequests(); Http::fake([ 'github.com/*' => Http::response('ok'),]); // An "ok" response is returned...Http::get('https://github.com/laravel/framework'); // An exception is thrown...Http::get('https://laravel.dokyumento.jp');
リクエストの検査
レスポンスを偽装する場合、アプリケーションが正しいデータまたはヘッダーを送信していることを確認するために、クライアントが受信するリクエストを検査したい場合があります。Http::fake
を呼び出した後に Http::assertSent
メソッドを呼び出すことで、これを実現できます。
assertSent
メソッドは、Illuminate\Http\Client\Request
インスタンスを受け取り、リクエストが期待どおりに一致するかどうかを示すブール値を返すクロージャを受け入れます。テストを合格させるには、少なくとも1つのリクエストが指定された期待どおりに発行されている必要があります。
use Illuminate\Http\Client\Request;use Illuminate\Support\Facades\Http; Http::fake(); Http::withHeaders([ 'X-First' => 'foo',])->post('http://example.com/users', [ 'name' => 'Taylor', 'role' => 'Developer',]); Http::assertSent(function (Request $request) { return $request->hasHeader('X-First', 'foo') && $request->url() == 'http://example.com/users' && $request['name'] == 'Taylor' && $request['role'] == 'Developer';});
必要に応じて、assertNotSent
メソッドを使用して、特定のリクエストが送信されなかったことをアサートできます。
use Illuminate\Http\Client\Request;use Illuminate\Support\Facades\Http; Http::fake(); Http::post('http://example.com/users', [ 'name' => 'Taylor', 'role' => 'Developer',]); Http::assertNotSent(function (Request $request) { return $request->url() === 'http://example.com/posts';});
assertSentCount
メソッドを使用して、テスト中に「送信」されたリクエストの数をアサートできます。
Http::fake(); Http::assertSentCount(5);
または、assertNothingSent
メソッドを使用して、テスト中にリクエストが送信されなかったことをアサートできます。
Http::fake(); Http::assertNothingSent();
リクエスト/レスポンスの記録
recorded
メソッドを使用して、すべてのリクエストと対応するレスポンスを収集できます。recorded
メソッドは、Illuminate\Http\Client\Request
と Illuminate\Http\Client\Response
のインスタンスを含む配列のコレクションを返します。
Http::fake([ 'https://laravel.dokyumento.jp' => Http::response(status: 500), 'https://nova.laravel.com/' => Http::response(),]); Http::get('https://laravel.dokyumento.jp');Http::get('https://nova.laravel.com/'); $recorded = Http::recorded(); [$request, $response] = $recorded[0];
さらに、recorded
メソッドは、Illuminate\Http\Client\Request
と Illuminate\Http\Client\Response
のインスタンスを受け取るクロージャを受け入れ、期待に基づいてリクエスト/レスポンスのペアをフィルタリングするために使用できます。
use Illuminate\Http\Client\Request;use Illuminate\Http\Client\Response; Http::fake([ 'https://laravel.dokyumento.jp' => Http::response(status: 500), 'https://nova.laravel.com/' => Http::response(),]); Http::get('https://laravel.dokyumento.jp');Http::get('https://nova.laravel.com/'); $recorded = Http::recorded(function (Request $request, Response $response) { return $request->url() !== 'https://laravel.dokyumento.jp' && $response->successful();});
イベント
Laravelは、HTTPリクエストの送信プロセス中に3つのイベントを発生させます。RequestSending
イベントは、リクエストが送信される前に発生し、ResponseReceived
イベントは、特定のリクエストに対するレスポンスが受信された後に発生します。ConnectionFailed
イベントは、特定のリクエストに対するレスポンスが受信されなかった場合に発生します。
RequestSending
イベントと ConnectionFailed
イベントの両方に、Illuminate\Http\Client\Request
インスタンスを検査するために使用できるパブリックな $request
プロパティが含まれています。同様に、ResponseReceived
イベントには、Illuminate\Http\Client\Response
インスタンスを検査するために使用できる $request
プロパティと $response
プロパティが含まれています。アプリケーション内でこれらのイベントの イベントリスナー を作成できます。
use Illuminate\Http\Client\Events\RequestSending; class LogRequest{ /** * Handle the given event. */ public function handle(RequestSending $event): void { // $event->request ... }}