Heim  >  Artikel  >  PHP-Framework  >  Analyse und Zusammenfassung von 5 Laravel-HTTP-Client-Tipps

Analyse und Zusammenfassung von 5 Laravel-HTTP-Client-Tipps

藏色散人
藏色散人nach vorne
2023-03-23 16:38:461433Durchsuche

Dieser Artikel vermittelt Ihnen hauptsächlich 5 Tipps zum Laravel-HTTP-Client. Ich hoffe, dass er für alle hilfreich ist.

Als Web-Entwickler müssen wir oft mit api aus Laravel-Anwendungen interagieren. Ein praktischer und intuitiver Wrapper für die Guzzle HTTP-Bibliothek wird in der Laravel HTTP-Clientversion 7 bereitgestellt. In diesem Artikel untersuchen wir fünf wertvolle Tipps zur Verwendung des Laravel HTTP Client, die Ihre Entwicklungserfahrung effizienter und angenehmer machen können. 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

Zu diesen Tipps gehören die Verwendung von HTTP-Makros, die Konfiguration von HTTP-Clients für Containerdienste, portable grundlegende URL-Konfigurationen und die Vermeidung von Unordnung beim Testen von Anfragen und Warten Sie auf HTTP-Ereignisse. Durch die Beherrschung dieser Techniken können Sie API-Interaktionen vereinfachen und robustere und wartbarere Laravel-Anwendungen erstellen.

HTTP-Makros

Viele Dienste von Laravel verfügen über eine Makros-Funktion, mit der Sie benutzerdefinierte Methoden für Ihre Anwendung definieren können. Sie können diese Makros zur boot()-Methode des Dienstanbieters hinzufügen, anstatt die Kernklasse aus dem Laravel-Framework zu erweitern.

Die HTTP-Dokumentation zeigt ein Beispiel eines Makros, mit dem Sie allgemeine Einstellungen definieren können: 🎜
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();
    }
}
🎜Makro Das können Sie Definieren Sie alle praktischen Methoden, die Sie definieren und in Ihrer Anwendung wiederverwenden möchten. Das Makrobeispiel in der Dokumentation enthält einen weiteren Tipp zum Konfigurieren eines HTTP-Clients für die Verwendung mit anderen Diensten. 🎜🎜Im nächsten Abschnitt werden wir die Methode zum Kombinieren von Makros mit der Übergabe von Clients an andere Containerdienste noch einmal betrachten. 🎜🎜 Konfigurieren Sie den HTTP-Client des Containerdienstes 🎜🎜Bei der Interaktion mit der API in einer Laravel-Anwendung möchten Sie möglicherweise verschiedene konfigurierbare Optionen für konfigurieren Client-Einstellungen. Wenn Ihre API beispielsweise über mehrere Umgebungen verfügt, müssen Sie die Basis-URL, Token, Timeout-Einstellungen usw. konfigurieren. 🎜🎜Wir können Makros verwenden, um den Client zu definieren, ihn als eigenen Dienst darzustellen und ihn dann in andere Dienste oder beides einzufügen. 🎜🎜Sehen wir uns zunächst an, wie die Client-Einstellungen in der Methode register() des Dienstanbieters definiert werden: 🎜
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(),
        ]);
    }
}
🎜In der Singleton-Dienstdefinition haben wir einige Aufrufe zum Konfigurieren des Clients verkettet. Das Ergebnis ist eine PendingRequest-Instanz, die wir wie folgt an unseren Dienstkonstruktor übergeben können: 🎜
use App\Listeners\LogRequestSending;
use Illuminate\Http\Client\Events\RequestSending;
// ...
protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
    ],
    RequestSending::class => [
        LogRequestSending::class,
    ],
];
🎜Der Dienst verwendet die Methode withOptions(), um Guzzle-Optionen direkt zu konfigurieren, aber Wir können auch einige praktische Methoden verwenden, die vom HTTP-Client bereitgestellt werden: 🎜
[2023-03-17 04:06:03] local.DEBUG: HTTP请求正在被发送。{"url": "https://api.example.com/v1/widget/123"}
🎜 Oder, wenn Sie Makros mit Diensten kombinieren möchten, können Sie dies im boot()AppServiceProvider tun /code>-Methode mit Ihrem definierten Makro: 🎜rrreee🎜Portable-Basis-URL-Konfiguration🎜🎜Möglicherweise haben Sie gesehen, dass die Standard-Basis-URL laut RFC3986, das maximale Portabilität bietet. 🎜🎜Nehmen Sie die folgende Dienstkonfiguration als Beispiel (beachten Sie die standardmäßige base_url): 🎜rrreee🎜Wenn unsere API in Produktions- und Testumgebungen das Pfadpräfix /v1/ hat, ist es möglicherweise nur https://stg-api.example.com/; Durch die Verwendung eines abschließenden Schrägstrichs funktioniert die URL wie erwartet, ohne dass der Code geändert werden muss. Bitte beachten Sie beim Konfigurieren des abschließenden /, dass alle API-Aufrufe in meinem Code relative Pfade verwenden: 🎜rrreee🎜Siehe Guzzles Erstellen Sie eine Client-Dokumentation, um zu verstehen, wie sich verschiedene base_uri-Stile auf die URI-Analyse auswirken. 🎜🎜Verhindern Sie verirrte Anfragen in Tests.🎜🎜Der HTTP-Client von Laravel bietet hervorragende Testtools, die das Schreiben von Tests zum Kinderspiel machen. Wenn ich Code schreibe, der mit der API interagiert, habe ich das Gefühl, dass bei meinen Tests in irgendeiner Weise tatsächliche Netzwerkanforderungen auftreten. Geben Sie Prevent Stray Requests mit dem HTTP-Client von Laravel ein: 🎜rrreee🎜 Meiner Meinung nach verwenden Sie preventStryRequests( ) besteht darin, eine setUp()-Methode in der Testklasse zu definieren, von der Sie erwarten, dass sie mit der API interagiert. Vielleicht könnten Sie dies auch zur Basisklasse TestCase Ihrer Anwendung hinzufügen. 🎜rrreee🎜Auf diese Weise stellen Sie sicher, dass jeder HTTP-Client-Aufruf, der in Ihrer Testsuite ausgelöst wird, durch eine gefälschte Anfrage unterstützt wird. Durch die Verwendung dieses Ansatzes kann ich sicher sein, dass ich in meinen Tests alle meine ausgehenden Anfragen mit einer gleichwertigen gefälschten Anfrage abgedeckt habe. 🎜🎜Protokollhandler für HTTP-Ereignisse🎜🎜Der HTTP-Client von Laravel verfügt über viele wertvolle Ereignisse, mit denen Sie schnell in wichtige Phasen des Anforderungs-/Antwortlebenszyklus eintauchen können. Zum Zeitpunkt des Schreibens dieses Artikels wurden drei Ereignisse ausgelöst: 🎜
  • 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

Das obige ist der detaillierte Inhalt vonAnalyse und Zusammenfassung von 5 Laravel-HTTP-Client-Tipps. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen