はじめに

Laravelは、Guzzle HTTPクライアントの周りに表現力豊かで最小限のAPIを提供し、他のWebアプリケーションと通信するために迅速にHTTPリクエストを送信できるようにします。LaravelのGuzzleラッパーは、最も一般的な使用ケースと素晴らしい開発者体験に焦点を当てています。

リクエストの作成

リクエストを作成するには、headgetpostputpatch、およびdeleteメソッドをHttpファサードから使用できます。まず、他のURLに基本的なGETリクエストを作成する方法を見てみましょう:

  1. use Illuminate\Support\Facades\Http;
  2. $response = Http::get('http://example.com');
  1. ``````php
  2. $response->body() : string;
  3. $response->json($key = null, $default = null) : mixed;
  4. $response->object() : object;
  5. $response->collect($key = null) : Illuminate\Support\Collection;
  6. $response->resource() : resource;
  7. $response->status() : int;
  8. $response->successful() : bool;
  9. $response->redirect(): bool;
  10. $response->failed() : bool;
  11. $response->clientError() : bool;
  12. $response->header($header) : string;
  13. $response->headers() : array;
  14. `
  1. ``````php
  2. return Http::get('http://example.com/users/1')['name'];
  3. `

上記のレスポンスメソッドに加えて、レスポンスが特定のステータスコードを持っているかどうかを判断するために使用できる以下のメソッドがあります:

  1. $response->ok() : bool; // 200 OK
  2. $response->created() : bool; // 201 Created
  3. $response->accepted() : bool; // 202 Accepted
  4. $response->noContent() : bool; // 204 No Content
  5. $response->movedPermanently() : bool; // 301 Moved Permanently
  6. $response->found() : bool; // 302 Found
  7. $response->badRequest() : bool; // 400 Bad Request
  8. $response->unauthorized() : bool; // 401 Unauthorized
  9. $response->paymentRequired() : bool; // 402 Payment Required
  10. $response->forbidden() : bool; // 403 Forbidden
  11. $response->notFound() : bool; // 404 Not Found
  12. $response->requestTimeout() : bool; // 408 Request Timeout
  13. $response->conflict() : bool; // 409 Conflict
  14. $response->unprocessableEntity() : bool; // 422 Unprocessable Entity
  15. $response->tooManyRequests() : bool; // 429 Too Many Requests
  16. $response->serverError() : bool; // 500 Internal Server Error

URIテンプレート

HTTPクライアントは、URIテンプレート仕様を使用してリクエストURLを構築することもできます。URIテンプレートによって展開できるURLパラメータを定義するには、withUrlParametersメソッドを使用します:

  1. Http::withUrlParameters([
  2. 'endpoint' => 'https://laravel.com',
  3. 'page' => 'docs',
  4. 'version' => '11.x',
  5. 'topic' => 'validation',
  6. ])->get('{+endpoint}/{page}/{version}/{topic}');

リクエストのダンプ

送信される前にアウトゴーイングリクエストインスタンスをダンプし、スクリプトの実行を終了したい場合は、リクエスト定義の最初にddメソッドを追加できます:

  1. return Http::dd()->get('http://example.com');

リクエストデータ

もちろん、POSTPUT、およびPATCHリクエストを作成する際に追加データを送信することは一般的であるため、これらのメソッドは第二引数としてデータの配列を受け入れます。デフォルトでは、データはapplication/jsonコンテンツタイプを使用して送信されます:

  1. use Illuminate\Support\Facades\Http;
  2. $response = Http::post('http://example.com/users', [
  3. 'name' => 'Steve',
  4. 'role' => 'Network Administrator',
  5. ]);

GETリクエストのクエリパラメータ

  1. ``````php
  2. $response = Http::get('http://example.com/users', [
  3. 'name' => 'Taylor',
  4. 'page' => 1,
  5. ]);
  6. `

また、withQueryParametersメソッドを使用することもできます:

  1. Http::retry(3, 100)->withQueryParameters([
  2. 'name' => 'Taylor',
  3. 'page' => 1,
  4. ])->get('http://example.com/users')

フォームURLエンコードリクエストの送信

  1. ``````php
  2. $response = Http::asForm()->post('http://example.com/users', [
  3. 'name' => 'Sara',
  4. 'role' => 'Privacy Consultant',
  5. ]);
  6. `

生リクエストボディの送信

リクエストを作成する際に生のリクエストボディを提供したい場合は、withBodyメソッドを使用できます。コンテンツタイプはメソッドの第二引数を介して提供できます:

  1. $response = Http::withBody(
  2. base64_encode($photo), 'image/jpeg'
  3. )->post('http://example.com/photo');

マルチパートリクエスト

ファイルをマルチパートリクエストとして送信したい場合は、リクエストを作成する前にattachメソッドを呼び出す必要があります。このメソッドは、ファイルの名前とその内容を受け入れます。必要に応じて、ファイル名と見なされる第三引数を提供することができ、第四引数を使用してファイルに関連するヘッダーを提供することができます:

  1. $response = Http::attach(
  2. 'attachment', file_get_contents('photo.jpg'), 'photo.jpg', ['Content-Type' => 'image/jpeg']
  3. )->post('http://example.com/attachments');

ファイルの生の内容を渡す代わりに、ストリームリソースを渡すことができます:

  1. $photo = fopen('photo.jpg', 'r');
  2. $response = Http::attach(
  3. 'attachment', $photo, 'photo.jpg'
  4. )->post('http://example.com/attachments');

ヘッダー

ヘッダーは、withHeadersメソッドを使用してリクエストに追加できます。このwithHeadersメソッドは、キー/バリューペアの配列を受け入れます:

  1. $response = Http::withHeaders([
  2. 'X-First' => 'foo',
  3. 'X-Second' => 'bar'
  4. ])->post('http://example.com/users', [
  5. 'name' => 'Taylor',
  6. ]);
  1. ``````php
  2. $response = Http::accept('application/json')->get('http://example.com/users');
  3. `

便利なことに、acceptJsonメソッドを使用して、アプリケーションがリクエストに対するレスポンスでapplication/jsonコンテンツタイプを期待していることを迅速に指定できます:

  1. $response = Http::acceptJson()->get('http://example.com/users');
  1. ``````php
  2. $response = Http::withHeaders([
  3. 'X-Original' => 'foo',
  4. ])->replaceHeaders([
  5. 'X-Replacement' => 'bar',
  6. ])->post('http://example.com/users', [
  7. 'name' => 'Taylor',
  8. ]);
  9. `

認証

基本認証およびダイジェスト認証の資格情報をそれぞれwithBasicAuthおよびwithDigestAuthメソッドを使用して指定できます:

  1. // Basic authentication...
  2. $response = Http::withBasicAuth('', 'secret')->post(/* ... */);
  3. // Digest authentication...
  4. $response = Http::withDigestAuth('', 'secret')->post(/* ... */);

ベアラートークン

リクエストのAuthorizationヘッダーにベアラートークンを迅速に追加したい場合は、withTokenメソッドを使用できます:

  1. $response = Http::withToken('token')->post(/* ... */);

タイムアウト

  1. ``````php
  2. $response = Http::timeout(3)->get(/* ... */);
  3. `

指定されたタイムアウトが超過された場合、Illuminate\Http\Client\ConnectionExceptionのインスタンスがスローされます。

サーバーへの接続を試みる際に待機する最大秒数をconnectTimeoutメソッドを使用して指定できます:

  1. $response = Http::connectTimeout(3)->get(/* ... */);

リトライ

クライアントまたはサーバーエラーが発生した場合にHTTPクライアントがリクエストを自動的に再試行するようにしたい場合は、retryメソッドを使用できます。retryメソッドは、リクエストを試行すべき最大回数と、Laravelが試行の間に待機すべきミリ秒数を受け入れます:

  1. $response = Http::retry(3, 100)->post(/* ... */);

試行の間にスリープするミリ秒数を手動で計算したい場合は、retryメソッドの第二引数としてクロージャを渡すことができます:

  1. use Exception;
  2. $response = Http::retry(3, function (int $attempt, Exception $exception) {
  3. return $attempt * 100;
  4. })->post(/* ... */);

便利なことに、retryメソッドの第一引数として配列を提供することもできます。この配列は、後続の試行の間にスリープするミリ秒数を決定するために使用されます:

  1. $response = Http::retry([100, 200])->post(/* ... */);

必要に応じて、retryメソッドに第三引数を渡すことができます。第三引数は、リトライが実際に試行されるべきかどうかを決定するコール可能である必要があります。たとえば、最初のリクエストがConnectionExceptionに遭遇した場合にのみリクエストを再試行したい場合があります:

  1. use Exception;
  2. use Illuminate\Http\Client\PendingRequest;
  3. $response = Http::retry(3, 100, function (Exception $exception, PendingRequest $request) {
  4. return $exception instanceof ConnectionException;
  5. })->post(/* ... */);

リクエスト試行が失敗した場合、新しい試行が行われる前にリクエストを変更したい場合があります。これは、retryメソッドに提供されたコール可能に提供されたリクエスト引数を変更することで実現できます。たとえば、最初の試行が認証エラーを返した場合に新しい認証トークンでリクエストを再試行したい場合があります:

  1. use Exception;
  2. use Illuminate\Http\Client\PendingRequest;
  3. use Illuminate\Http\Client\RequestException;
  4. $response = Http::withToken($this->getToken())->retry(2, 0, function (Exception $exception, PendingRequest $request) {
  5. if (! $exception instanceof RequestException || $exception->response->status() !== 401) {
  6. return false;
  7. }
  8. $request->withToken($this->getNewToken());
  9. return true;
  10. })->post(/* ... */);

すべてのリクエストが失敗した場合、Illuminate\Http\Client\RequestExceptionのインスタンスがスローされます。この動作を無効にしたい場合は、throw引数にfalseの値を提供できます。無効にすると、すべてのリトライが試行された後、クライアントによって受信された最後のレスポンスが返されます:

  1. $response = Http::retry(3, 100, throw: false)->post(/* ... */);

接続の問題でリクエスト試行がすべて失敗した場合、Illuminate\Http\Client\ConnectionExceptionthrow引数がfalseに設定されていてもスローされます。

エラーハンドリング

Guzzleのデフォルトの動作とは異なり、LaravelのHTTPクライアントラッパーは、クライアントまたはサーバーエラー(サーバーからの400および500レベルのレスポンス)で例外をスローしません。これらのエラーのいずれかが返されたかどうかを判断するには、successfulclientError、またはserverErrorメソッドを使用できます:

  1. // Determine if the status code is >= 200 and < 300...
  2. $response->successful();
  3. // Determine if the status code is >= 400...
  4. $response->failed();
  5. // Determine if the response has a 400 level status code...
  6. $response->clientError();
  7. // Determine if the response has a 500 level status code...
  8. $response->serverError();
  9. // Immediately execute the given callback if there was a client or server error...
  10. $response->onError(callable $callback);

例外のスロー

レスポンスインスタンスがあり、レスポンスステータスコードがクライアントまたはサーバーエラーを示す場合にIlluminate\Http\Client\RequestExceptionのインスタンスをスローしたい場合は、throwまたはthrowIfメソッドを使用できます:

  1. use Illuminate\Http\Client\Response;
  2. $response = Http::post(/* ... */);
  3. // Throw an exception if a client or server error occurred...
  4. $response->throw();
  5. // Throw an exception if an error occurred and the given condition is true...
  6. $response->throwIf($condition);
  7. // Throw an exception if an error occurred and the given closure resolves to true...
  8. $response->throwIf(fn (Response $response) => true);
  9. // Throw an exception if an error occurred and the given condition is false...
  10. $response->throwUnless($condition);
  11. // Throw an exception if an error occurred and the given closure resolves to false...
  12. $response->throwUnless(fn (Response $response) => false);
  13. // Throw an exception if the response has a specific status code...
  14. $response->throwIfStatus(403);
  15. // Throw an exception unless the response has a specific status code...
  16. $response->throwUnlessStatus(200);
  17. return $response['user']['id'];
  1. `````throw`````メソッドは、エラーが発生しなかった場合にレスポンスインスタンスを返し、`````throw`````メソッドに他の操作をチェーンすることを可能にします:
  2. ``````php
  3. return Http::post(/* ... */)->throw()->json();
  4. `

例外がスローされる前に追加のロジックを実行したい場合は、throwメソッドにクロージャを渡すことができます。クロージャが呼び出された後に自動的に例外がスローされるため、クロージャ内で例外を再スローする必要はありません:

  1. use Illuminate\Http\Client\Response;
  2. use Illuminate\Http\Client\RequestException;
  3. return Http::post(/* ... */)->throw(function (Response $response, RequestException $e) {
  4. // ...
  5. })->json();

Guzzleミドルウェア

LaravelのHTTPクライアントはGuzzleによって動かされているため、Guzzleミドルウェアを利用してアウトゴーイングリクエストを操作したり、インカミングレスポンスを検査したりできます。アウトゴーイングリクエストを操作するには、withRequestMiddlewareメソッドを介してGuzzleミドルウェアを登録します:

  1. use Illuminate\Support\Facades\Http;
  2. use Psr\Http\Message\RequestInterface;
  3. $response = Http::withRequestMiddleware(
  4. function (RequestInterface $request) {
  5. return $request->withHeader('X-Example', 'Value');
  6. }
  7. )->get('http://example.com');

同様に、withResponseMiddlewareメソッドを介してミドルウェアを登録することで、インカミングHTTPレスポンスを検査できます:

  1. use Illuminate\Support\Facades\Http;
  2. use Psr\Http\Message\ResponseInterface;
  3. $response = Http::withResponseMiddleware(
  4. function (ResponseInterface $response) {
  5. $header = $response->getHeader('X-Example');
  6. // ...
  7. return $response;
  8. }
  9. )->get('http://example.com');

グローバルミドルウェア

時には、すべてのアウトゴーイングリクエストとインカミングレスポンスに適用されるミドルウェアを登録したい場合があります。これを実現するには、globalRequestMiddlewareおよびglobalResponseMiddlewareメソッドを使用します。通常、これらのメソッドはアプリケーションのAppServiceProviderbootメソッド内で呼び出されるべきです:

  1. use Illuminate\Support\Facades\Http;
  2. Http::globalRequestMiddleware(fn ($request) => $request->withHeader(
  3. 'User-Agent', 'Example Application/1.0'
  4. ));
  5. Http::globalResponseMiddleware(fn ($response) => $response->withHeader(
  6. 'X-Finished-At', now()->toDateTimeString()
  7. ));

Guzzleオプション

アウトゴーイングリクエストに対して追加のGuzzleリクエストオプションを指定するには、withOptionsメソッドを使用します。withOptionsメソッドは、キー/バリューペアの配列を受け入れます:

  1. $response = Http::withOptions([
  2. 'debug' => true,
  3. ])->get('http://example.com/users');

グローバルオプション

すべてのアウトゴーイングリクエストのデフォルトオプションを構成するには、globalOptionsメソッドを利用できます。通常、このメソッドはアプリケーションのAppServiceProviderbootメソッドから呼び出されるべきです:

  1. use Illuminate\Support\Facades\Http;
  2. /**
  3. * Bootstrap any application services.
  4. */
  5. public function boot(): void
  6. {
  7. Http::globalOptions([
  8. 'allow_redirects' => false,
  9. ]);
  10. }

同時リクエスト

時には、複数のHTTPリクエストを同時に行いたい場合があります。言い換えれば、リクエストを逐次的に発行するのではなく、同時にいくつかのリクエストを送信したいのです。これは、遅いHTTP APIと対話する際に大幅なパフォーマンス向上をもたらす可能性があります。

幸いなことに、poolメソッドを使用してこれを実現できます。poolメソッドは、Illuminate\Http\Client\Poolインスタンスを受け取るクロージャを受け入れ、リクエストプールにリクエストを簡単に追加できます:

  1. use Illuminate\Http\Client\Pool;
  2. use Illuminate\Support\Facades\Http;
  3. $responses = Http::pool(fn (Pool $pool) => [
  4. $pool->get('http://localhost/first'),
  5. $pool->get('http://localhost/second'),
  6. $pool->get('http://localhost/third'),
  7. ]);
  8. return $responses[0]->ok() &&
  9. $responses[1]->ok() &&
  10. $responses[2]->ok();

ご覧のとおり、各レスポンスインスタンスはプールに追加された順序に基づいてアクセスできます。必要に応じて、asメソッドを使用してリクエストに名前を付けることができ、対応するレスポンスに名前でアクセスできます:

  1. use Illuminate\Http\Client\Pool;
  2. use Illuminate\Support\Facades\Http;
  3. $responses = Http::pool(fn (Pool $pool) => [
  4. $pool->as('first')->get('http://localhost/first'),
  5. $pool->as('second')->get('http://localhost/second'),
  6. $pool->as('third')->get('http://localhost/third'),
  7. ]);
  8. return $responses['first']->ok();

同時リクエストのカスタマイズ

  1. ``````php
  2. use Illuminate\Http\Client\Pool;
  3. use Illuminate\Support\Facades\Http;
  4. $headers = [
  5. 'X-Example' => 'example',
  6. ];
  7. $responses = Http::pool(fn (Pool $pool) => [
  8. $pool->withHeaders($headers)->get('http://laravel.test/test'),
  9. $pool->withHeaders($headers)->get('http://laravel.test/test'),
  10. $pool->withHeaders($headers)->get('http://laravel.test/test'),
  11. ]);
  12. `

マクロ

Laravel HTTPクライアントは、サービスと対話する際に一般的なリクエストパスやヘッダーを構成するための流暢で表現力豊かなメカニズムとして機能する「マクロ」を定義することを許可します。始めるには、アプリケーションのApp\Providers\AppServiceProviderクラスのbootメソッド内でマクロを定義できます:

  1. use Illuminate\Support\Facades\Http;
  2. /**
  3. * Bootstrap any application services.
  4. */
  5. public function boot(): void
  6. {
  7. Http::macro('github', function () {
  8. return Http::withHeaders([
  9. 'X-Example' => 'example',
  10. ])->baseUrl('https://github.com');
  11. });
  12. }

マクロが構成されると、アプリケーションのどこからでもそれを呼び出して、指定された構成で保留中のリクエストを作成できます:

  1. $response = Http::github()->get('/');

テスト

多くのLaravelサービスは、簡単かつ表現力豊かにテストを書くのを助ける機能を提供しており、LaravelのHTTPクライアントも例外ではありません。Httpファサードのfakeメソッドを使用すると、リクエストが行われたときにHTTPクライアントにスタブ/ダミーレスポンスを返すよう指示できます。

レスポンスのフェイク

たとえば、HTTPクライアントにすべてのリクエストに対して空の200ステータスコードレスポンスを返すよう指示するには、引数なしでfakeメソッドを呼び出します:

  1. use Illuminate\Support\Facades\Http;
  2. Http::fake();
  3. $response = Http::post(/* ... */);

特定のURLのフェイク

代わりに、fakeメソッドに配列を渡すことができます。配列のキーは、フェイクしたいURLパターンとその関連レスポンスを表す必要があります。*文字はワイルドカード文字として使用できます。フェイクされていないURLへのリクエストは実際に実行されます。これらのエンドポイントのスタブ/フェイクレスポンスを構築するには、Httpファサードのresponseメソッドを使用できます:

  1. Http::fake([
  2. // Stub a JSON response for GitHub endpoints...
  3. 'github.com/*' => Http::response(['foo' => 'bar'], 200, $headers),
  4. // Stub a string response for Google endpoints...
  5. 'google.com/*' => Http::response('Hello World', 200, $headers),
  6. ]);

一致しないすべてのURLをスタブするフォールバックURLパターンを指定したい場合は、単一の*文字を使用できます:

  1. Http::fake([
  2. // Stub a JSON response for GitHub endpoints...
  3. 'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']),
  4. // Stub a string response for all other endpoints...
  5. '*' => Http::response('Hello World', 200, ['Headers']),
  6. ]);

レスポンスシーケンスのフェイク

時には、単一のURLが特定の順序で一連のフェイクレスポンスを返す必要がある場合があります。これは、Http::sequenceメソッドを使用してレスポンスを構築することで実現できます:

  1. Http::fake([
  2. // Stub a series of responses for GitHub endpoints...
  3. 'github.com/*' => Http::sequence()
  4. ->push('Hello World', 200)
  5. ->push(['foo' => 'bar'], 200)
  6. ->pushStatus(404),
  7. ]);

レスポンスシーケンス内のすべてのレスポンスが消費されると、さらなるリクエストはレスポンスシーケンスが例外をスローします。シーケンスが空のときに返されるデフォルトレスポンスを指定したい場合は、whenEmptyメソッドを使用できます:

  1. Http::fake([
  2. // Stub a series of responses for GitHub endpoints...
  3. 'github.com/*' => Http::sequence()
  4. ->push('Hello World', 200)
  5. ->push(['foo' => 'bar'], 200)
  6. ->whenEmpty(Http::response()),
  7. ]);

レスポンスのシーケンスをフェイクしたいが、フェイクすべき特定のURLパターンを指定する必要がない場合は、Http::fakeSequenceメソッドを使用できます:

  1. Http::fakeSequence()
  2. ->push('Hello World', 200)
  3. ->whenEmpty(Http::response());

フェイクコールバック

特定のエンドポイントに対して返すレスポンスを決定するために、より複雑なロジックが必要な場合は、fakeメソッドにクロージャを渡すことができます。このクロージャはIlluminate\Http\Client\Requestのインスタンスを受け取り、レスポンスインスタンスを返す必要があります。クロージャ内で、返すレスポンスのタイプを決定するために必要なロジックを実行できます:

  1. use Illuminate\Http\Client\Request;
  2. Http::fake(function (Request $request) {
  3. return Http::response('Hello World', 200);
  4. });

迷惑なリクエストの防止

HTTPクライアントを介して送信されるすべてのリクエストが、個々のテストまたは完全なテストスイート全体でフェイクされていることを確認したい場合は、preventStrayRequestsメソッドを呼び出すことができます。このメソッドを呼び出した後、対応するフェイクレスポンスがないリクエストは、実際のHTTPリクエストを行うのではなく例外をスローします:

  1. use Illuminate\Support\Facades\Http;
  2. Http::preventStrayRequests();
  3. Http::fake([
  4. 'github.com/*' => Http::response('ok'),
  5. ]);
  6. // An "ok" response is returned...
  7. Http::get('https://github.com/laravel/framework');
  8. // An exception is thrown...
  9. Http::get('https://laravel.com');

リクエストの検査

レスポンスをフェイクする際、クライアントが受信するリクエストを検査して、アプリケーションが正しいデータやヘッダーを送信していることを確認したい場合があります。これは、Http::assertSentメソッドをHttp::fakeの後に呼び出すことで実現できます。

  1. ``````php
  2. use Illuminate\Http\Client\Request;
  3. use Illuminate\Support\Facades\Http;
  4. Http::fake();
  5. Http::withHeaders([
  6. 'X-First' => 'foo',
  7. ])->post('http://example.com/users', [
  8. 'name' => 'Taylor',
  9. 'role' => 'Developer',
  10. ]);
  11. Http::assertSent(function (Request $request) {
  12. return $request->hasHeader('X-First', 'foo') &&
  13. $request->url() == 'http://example.com/users' &&
  14. $request['name'] == 'Taylor' &&
  15. $request['role'] == 'Developer';
  16. });
  17. `

必要に応じて、assertNotSentメソッドを使用して特定のリクエストが送信されなかったことを主張できます:

  1. use Illuminate\Http\Client\Request;
  2. use Illuminate\Support\Facades\Http;
  3. Http::fake();
  4. Http::post('http://example.com/users', [
  5. 'name' => 'Taylor',
  6. 'role' => 'Developer',
  7. ]);
  8. Http::assertNotSent(function (Request $request) {
  9. return $request->url() === 'http://example.com/posts';
  10. });
  1. ``````php
  2. Http::fake();
  3. Http::assertSentCount(5);
  4. `

または、assertNothingSentメソッドを使用して、テスト中にリクエストが送信されなかったことを主張できます:

  1. Http::fake();
  2. Http::assertNothingSent();

リクエスト/レスポンスの記録

  1. ``````php
  2. Http::fake([
  3. 'https://laravel.com' => Http::response(status: 500),
  4. 'https://nova.laravel.com/' => Http::response(),
  5. ]);
  6. Http::get('https://laravel.com');
  7. Http::get('https://nova.laravel.com/');
  8. $recorded = Http::recorded();
  9. [$request, $response] = $recorded[0];
  10. `

さらに、recordedメソッドは、Illuminate\Http\Client\RequestIlluminate\Http\Client\Responseのインスタンスを受け取り、期待に基づいてリクエスト/レスポンスペアをフィルタリングするために使用できるクロージャを受け入れます:

  1. use Illuminate\Http\Client\Request;
  2. use Illuminate\Http\Client\Response;
  3. Http::fake([
  4. 'https://laravel.com' => Http::response(status: 500),
  5. 'https://nova.laravel.com/' => Http::response(),
  6. ]);
  7. Http::get('https://laravel.com');
  8. Http::get('https://nova.laravel.com/');
  9. $recorded = Http::recorded(function (Request $request, Response $response) {
  10. return $request->url() !== 'https://laravel.com' &&
  11. $response->successful();
  12. });

イベント

Laravelは、HTTPリクエストを送信するプロセス中に3つのイベントを発火します。RequestSendingイベントはリクエストが送信される前に発火し、ResponseReceivedイベントは特定のリクエストに対するレスポンスが受信された後に発火します。ConnectionFailedイベントは、特定のリクエストに対するレスポンスが受信されなかった場合に発火します。

RequestSendingおよびConnectionFailedイベントには、$requestプロパティが公開されており、Illuminate\Http\Client\Requestインスタンスを検査するために使用できます。同様に、ResponseReceivedイベントには$requestプロパティと$responseプロパティが含まれており、Illuminate\Http\Client\Responseインスタンスを検査するために使用できます。これらのイベントのevent listenersをアプリケーション内で作成できます:

  1. use Illuminate\Http\Client\Events\RequestSending;
  2. class LogRequest
  3. {
  4. /**
  5. * Handle the given event.
  6. */
  7. public function handle(RequestSending $event): void
  8. {
  9. // $event->request ...
  10. }
  11. }