Laravel HTTP クライアントの 5 つのヒントの分析と要約

藏色散人
リリース: 2023-03-23 16:39:21
転載
1432 人が閲覧しました

この記事では、Laravel に関する関連知識をお届けします。主に Laravel HTTP クライアントの 5 つのヒントを紹介します。興味のある友人はぜひご覧ください。皆さんのお役に立てれば幸いです。

web 開発者として、Laravel アプリケーションから api を操作する必要がよくあります。便利で直感的な Guzzle HTTP ライブラリ ラッパーは、Laravel HTTP クライアント バージョン 7 で提供されています。この記事では、開発体験をより効率的で楽しいものにする、Laravel HTTP クライアントを使用するための 5 つの貴重なヒントを紹介します。 これらの手法には、HTTP

マクロの使用、コンテナ サービス用の

HTTP クライアントの構成、移植可能な基本的な URL 構成、その他のリクエストの防止、# のリッスンが含まれます。 ##HTTP イベント。これらのテクニックをマスターすると、API インタラクションを簡素化し、より堅牢で保守しやすい Laravel アプリケーションを作成できます。 HTTP マクロLaravel のサービスの多くには、アプリケーションのカスタム メソッドを定義できる

マクロ

機能があります。 Laravel フレームワークからコアクラスを拡張する代わりに、これらのマクロをサービスプロバイダーの

boot()

メソッドに追加できます。 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 クライアントの構成

Laravel アプリケーションで API を操作するとき、クライアントに対してさまざまな構成可能な設定を構成することが必要になる場合があります。たとえば、API に複数の環境がある場合は、ベース URL、トークン、タイムアウト設定などを構成する必要があります。 マクロを使用してクライアントを定義し、クライアントを独自のサービスとして表現し、それを他のサービスに挿入したり、その両方を行うことができます。

まず、サービス プロバイダーの

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 の末尾に が含まれていることがわかります。 /。

RFC3986

に従って最大限の移植性を提供します。

次のサービス構成を例に挙げます (デフォルトの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),
    ],
];
ログイン後にコピー
API に本番環境およびテスト環境でパス プレフィックス /v1/ がある場合、おそらくそれは単なる

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(&#39;HTTP请求正在发送。&#39;, [&#39;url&#39; => $event->request->url()
            &#39;url&#39; => $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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!