Maison  >  Article  >  cadre php  >  Analyse et résumé de 5 astuces du client HTTP Laravel

Analyse et résumé de 5 astuces du client HTTP Laravel

藏色散人
藏色散人avant
2023-03-23 16:38:461445parcourir

Cet article vous apporte des connaissances pertinentes sur Laravel. Il partage principalement avec vous 5 conseils sur le client HTTP Laravel. Les amis intéressés peuvent jeter un œil ci-dessous. J'espère que cela sera utile à tout le monde.

En tant que développeurs web, nous devons souvent interagir avec l'api des applications Laravel. Un wrapper pratique et intuitif pour la bibliothèque Guzzle HTTP est fourni dans la version client Laravel HTTP 7. Dans cet article, nous explorerons cinq conseils précieux pour utiliser le Client HTTP Laravel qui peuvent rendre votre expérience de développement plus efficace et plus agréable. 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

Ces conseils incluent l'utilisation de macros HTTP, la configuration des clients HTTP pour les services de conteneurs, les configurations URL de base portables et la prévention de l'encombrement lors des tests. Effectuer des requêtes et écoutez les événements HTTP. En maîtrisant ces techniques, vous pouvez simplifier les interactions API et créer des applications Laravel plus robustes et maintenables.

Macros HTTP

De nombreux services de Laravel disposent d'une fonctionnalité macros qui vous permet de définir des méthodes personnalisées pour votre application. Vous pouvez ajouter ces macros à la méthode boot() du fournisseur de services au lieu d'étendre la classe principale du framework Laravel.

La documentation HTTP montre un exemple de macro que vous pouvez utiliser pour définir des paramètres communs : 🎜
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();
    }
}
🎜Macro Vous pouvez définissez toutes les méthodes pratiques que vous souhaitez définir et réutiliser dans votre application. L'exemple de macro dans la documentation implique une autre astuce pour configurer un client HTTP à utiliser avec d'autres services. 🎜🎜Dans la section suivante, nous reviendrons sur la méthode de combinaison de macros avec le passage des clients vers d'autres services de conteneurs. 🎜🎜 Configurez le client HTTP du service de conteneur 🎜🎜Lorsque vous interagissez avec l'API dans une application Laravel, vous souhaiterez peut-être configurer diverses options configurables pour le paramètres du client. Par exemple, si votre API dispose de plusieurs environnements, vous devez configurer l'URL de base, les jetons, les paramètres de délai d'attente, etc. 🎜🎜Nous pouvons utiliser des macros pour définir le client, représenter le client comme son propre service, puis l'injecter dans d'autres services, ou les deux. 🎜🎜Tout d'abord, voyons comment définir les paramètres du client dans la méthode register() du fournisseur de services : 🎜
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(),
        ]);
    }
}
🎜Dans la définition du service singleton, nous avons enchaîné quelques appels pour configurer le client. Le résultat est une instance PendingRequest, que nous pouvons transmettre à notre constructeur de service comme ceci : 🎜
use App\Listeners\LogRequestSending;
use Illuminate\Http\Client\Events\RequestSending;
// ...
protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
    ],
    RequestSending::class => [
        LogRequestSending::class,
    ],
];
🎜Le service utilise la méthode withOptions() pour configurer directement les options de Guzzle, mais nous pouvons également utiliser certaines méthodes pratiques fournies par le client HTTP : 🎜
[2023-03-17 04:06:03] local.DEBUG: HTTP请求正在被发送。{"url": "https://api.example.com/v1/widget/123"}
🎜 Ou, si vous souhaitez combiner des macros avec des services, vous pouvez le faire dans le boot()AppServiceProvider. /code> en utilisant votre macro définie : 🎜rrreee🎜Configuration de l'URL de base portable🎜🎜Vous avez peut-être vu que l'URL de base par défaut contient un / final, selon RFC3986, qui offre une portabilité maximale. 🎜🎜Prenons la configuration de service suivante comme exemple (notez l'url base_url par défaut) : 🎜rrreee🎜Si notre API a un préfixe de chemin /v1/ dans les environnements de production et de test, il s'agit peut-être simplement de https://stg-api.example.com/ ; L'utilisation d'une barre oblique finale permet à l'URL de fonctionner comme prévu sans modifier le code. Lors de la configuration du / de fin, veuillez noter que tous les appels d'API dans mon code utilisent des chemins relatifs : 🎜rrreee🎜Voir Créer une documentation client pour comprendre comment les différents styles base_uri affectent l'analyse des URI. 🎜🎜Prévenir les requêtes parasites dans les tests🎜🎜Le client HTTP de Laravel fournit d'excellents outils de test qui facilitent l'écriture de tests. Lorsque j'écris du code qui interagit avec l'API, je me sens mal à l'aise à l'idée que mes tests génèrent de véritables requêtes réseau. Entrez Empêcher les requêtes parasites avec le client HTTP de Laravel : 🎜rrreee🎜 À mon avis, utilisez preventStryRequests( ) consiste à définir une méthode setUp() dans la classe de test avec laquelle vous prévoyez d'interagir avec l'API. Vous pourriez peut-être également l'ajouter à la classe TestCase de base de votre application. 🎜rrreee🎜 Cela garantira que chaque appel client HTTP lancé dans votre suite de tests est soutenu par une fausse requête. L'utilisation de cette approche me donne la certitude d'avoir couvert toutes mes requêtes sortantes avec une fausse requête équivalente lors de mes tests. 🎜🎜Gestionnaire de journaux pour les événements HTTP🎜🎜Le client HTTP de Laravel contient de nombreux événements précieux que vous pouvez utiliser pour approfondir rapidement les étapes importantes du cycle de vie des requêtes/réponses. Au moment de la rédaction de cet article, trois événements se sont déclenchés : 🎜
  • 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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer