この記事では、Laravel に関する関連知識をお届けします。主に Laravel HTTP クライアントの 5 つのヒントを紹介します。興味のある友人はぜひご覧ください。皆さんのお役に立てれば幸いです。
web 開発者として、
Laravel アプリケーションから
api を操作する必要がよくあります。便利で直感的な
Guzzle HTTP ライブラリ ラッパーは、
Laravel HTTP クライアント バージョン
7 で提供されています。この記事では、開発体験をより効率的で楽しいものにする、Laravel HTTP クライアントを使用するための 5 つの貴重なヒントを紹介します。
これらの手法には、
HTTP
HTTP クライアントの構成、移植可能な基本的な
URL 構成、その他のリクエストの防止、# のリッスンが含まれます。 ##HTTP
イベント。これらのテクニックをマスターすると、API
インタラクションを簡素化し、より堅牢で保守しやすい Laravel
アプリケーションを作成できます。 HTTP マクロ
Laravel のサービスの多くには、アプリケーションのカスタム メソッドを定義できる
メソッドに追加できます。 HTTP ドキュメントには、一般的な設定を定義するために使用できるマクロの
example
が示されています。
public function boot(): void { Http::macro('github', function () { return Http::withHeaders([ 'X-Example' => 'example', ])->baseUrl('https://github.com'); }); } // Usage response = Http::github()->get('/');
マクロは、アプリケーションで定義したいものをすべて定義でき、便利です再利用するための方法。ドキュメント内のマクロの例には、他のサービスで使用する HTTP クライアントを構成するための別のヒントが含まれています。 次のセクションでは、マクロを組み合わせてクライアントを他のコンテナ サービスに渡す方法を再検討します。
コンテナ サービス用の HTTP クライアントの構成
まず、サービス プロバイダーの
register()メソッドでクライアント設定を定義する方法を見てみましょう:
public function register(): void { $this->app->singleton(ExampleService::class, function (Application $app) { $client = Http::withOptions([ 'base_uri' => config('services.example.base_url'), 'timeout' => config('services.example.timeout', 10), 'connect_timeout' => config('services.example.connect_timeout', 2), ])->withToken(config('services.example.token')); return new ExampleService($client); }); }
シングルトン サービス定義では、いくつかの呼び出しが行われます。クライアントを設定します。結果は PendingRequest
インスタンスであり、次のようにサービス コンストラクターに渡すことができます:
class ExampleService { public function __construct( private PendingRequest $client ) {} public function getWidget(string $uid) { $response = $this->client ->withUrlParameters(['uid' => $uid]) ->get('widget/{uid}'); return new Widget($response->json()); } }
サービスは withOptions()
メソッド Guzzle オプションを使用して直接構成されます。ただし、HTTP クライアントによって提供されるいくつかの便利なメソッドを使用することもできます。
$this->app->singleton(ExampleService::class, function (Application $app) { $client = Http::baseUrl(config('services.example.base_url')) ->timeout(config('services.example.timeout', 10)) ->connectTimeout(config('services.example.connect_timeout', 2)) ->withToken(config('services.example.token')); return new ExampleService($client); });
または、マクロとサービスを組み合わせたい場合は、AppServiceProvider# の ## で行うことができます。
boot()
$this->app->singleton(ExampleService::class, function (Application $app) { return new ExampleService(Http::github()); });
移植可能なベース URL 構成
デフォルトのベース URL の末尾に
が含まれていることがわかります。 /。 次のサービス構成を例に挙げます (デフォルトのbase_url に注意してください):
return [ 'example' => [ 'base_url' => env('EXAMPLE_BASE_URI', 'https://api.example.com/v1/'), 'token' => env('EXAMPLE_SERVICE_TOKEN'), 'timeout' => env('EXAMPLE_SERVICE_TIMEOUT', 10), 'connect_timeout' => env('EXAMPLE_SERVICE_TIMEOUT', 2), ], ];
https://stg-api.example.com/
; 末尾のスラッシュを使用すると、コードを変更せずに URL が期待どおりに機能するようになります。末尾の/ を設定する際、コード内のすべての API 呼び出しで相対パスが使用されることに注意してください。
$this->client ->withUrlParameters(['uid' => $uid]) // 例子: // 测试环境 - https://stg-api.example.com/widget/123 // 生产环境 - https://api.example.com/v1/widget/123 ->get('widget/{uid}');
Guzzle の
Creating a Client ドキュメントを参照し、base_uri スタイルの違いを確認してください。 URI 解析に影響します。
テストでの迷走リクエストの防止Laravel の HTTP クライアントは、テストの作成を簡単にする優れたテスト ツールを提供します。 API と対話するコードを作成するとき、テストで実際のネットワーク リクエストが何らかの形で発生しているのではないかと不安になります。 Laravel HTTP クライアントで Preventing Stray Requests
を入力します:Http::preventStrayRequests(); Http::fake([ 'github.com/*' => Http::response('ok'), ]); // Run test code // If any other code triggers an HTTP call via Laravel's client // an exception is thrown.
preventStrayRequests() を使用する最良の方法は、API で期待する場所です。インタラクティブ テスト クラスの ##setUp() メソッド。おそらく、これをアプリケーションの基本
TestCase クラスに追加することもできます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">namespace Tests;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Support\Facades\Http;
abstract class TestCase extends BaseTestCase
{
use CreatesApplication;
public function setUp(): void
{
parent::setUp();
Http::preventStrayRequests();
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
これを行うと、テスト スイートで起動されるすべての HTTP クライアント呼び出しが偽のリクエストによって裏付けられるようになります。このアプローチを使用すると、テストですべてのアウトバウンド リクエストを同等の偽のリクエストでカバーできたという大きな自信が得られます。 HTTP イベントのログ ハンドラー
Laravel の HTTP クライアントには、リクエスト/レスポンスのライフサイクルの重要な段階を素早く調べるために使用できる貴重なイベントが多数あります。この記事の執筆時点では、3 つのイベントがトリガーされました:
Illuminate\HttpClient\Events\RequestSending
IlluminateHttpClient\Events\ResponseReceived
IlluminateHttpClient\EventsConnectionFailed
比方说,你想把你的应用程序发出请求的每个 URL 都可视化。我们可以很容易地接入 RequestSending
事件,并记录出每个请求。
namespoace App/Listeners; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Support\Facades\Log; class LogRequestSending { public function handle(object $event): void { Log::debug('HTTP请求正在发送。', ['url' => $event->request->url() 'url' => $event->request->url(), ]); } }
为了使事件处理程序工作,在 EventServiceProvider
类中添加以下内容。
use App\Listeners\LogRequestSending; use Illuminate\Http\Client\Events\RequestSending; // ... protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], RequestSending::class => [ LogRequestSending::class, ], ];
一旦它被连接起来,你就会在你的日志中看到类似于 HTTP 客户端尝试的每个请求的内容。
[2023-03-17 04:06:03] local.DEBUG: HTTP请求正在被发送。{"url": "https://api.example.com/v1/widget/123"}
官方的Laravel HTTP 文档有你需要的一切,可以开始了。我希望这个教程能给你一些灵感和技巧,你可以在你的 Laravel 应用程序中使用。
原文地址:https://laravel-news.com/laravel-http-cl...
译文地址:https://www.php.cn/link/bac346f4c260a59fde0b1546e8a025aa
以上がLaravel HTTP クライアントの 5 つのヒントの分析と要約の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。