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 ErrorURIテンプレート
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('https:///first'),    $pool->get('https:///second'),    $pool->get('https:///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('https:///first'),    $pool->as('second')->get('https:///second'),    $pool->as('third')->get('https:///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 ...    }}