首頁  >  文章  >  php框架  >  分析總結5個Laravel HTTP Client小技巧

分析總結5個Laravel HTTP Client小技巧

藏色散人
藏色散人轉載
2023-03-23 16:38:461432瀏覽

這篇文章為大家帶來了關於Laravel的相關知識,其中主要跟大家分享5個Laravel HTTP Client的小技巧,有興趣的朋友下面一起來看一下吧,希望對大家有幫助。

身為web開發人員,我們經常需要與來自Laravel應用程式的api進行互動。在Laravel HTTP客戶端版本7中提供了一個方便且直覺的Guzzle HTTP庫包裝器。在本文中,我們將探討使用Laravel HTTP Client的五個有價值的技巧,這些技巧可以讓你的開發體驗更有效率、更愉快。

這些技巧包括使用HTTP巨集、為容器服務配置HTTP客戶機、可移植的基本URL設定、防止測試中的雜發請求以及偵聽HTTP事件。透過掌握這些技巧,你可以簡化API互動並創建更健壯和可維護的Laravel應用程式。

HTTP 巨集

Laravel 的許多服務都有一個巨集特性,允許你為應用程式定義自訂方法。你可以將這些巨集加入到服務提供者的boot()方法中,而不是從 Laravel 框架擴充核心類別。

HTTP 文件中展示了一個巨集的範例,你可以使用它來定義常見的設定:

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);
});

或者,如果你想要將巨集與服務結合,可以在你的AppServiceProviderboot() 方法中使用你定義的巨集:

$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 的建立客戶端文檔,了解不同的base_uri 風格是如何影響URI 的解析的。

防止測試中的雜散請求

Laravel 的 HTTP 用戶端提供了優秀的測試工具,讓編寫測試變得輕而易舉。當我寫與 API 互動的程式碼時,我感到不安的是我的測試在某種程度上有實際的網路請求發生。進入防止雜散請求與Laravel 的HTTP 客戶端:

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 類別中。

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();
    }
}

這樣做將確保你的測試套件中觸發的每個 HTTP 用戶端呼叫都有一個假的請求支援。使用這種方法給了我很大的信心,我已經在我的測試中用一個等價的假請求覆蓋了我所有的出站請求。

HTTP 事件的日誌處理程序

Laravel 的 HTTP 用戶端有很多有價值的事件,你可以用它們來快速挖掘請求/回應生命週期的重要階段。在寫這篇文章的時候,有三個事件被觸發:

  • 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

以上是分析總結5個Laravel HTTP Client小技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除