Laravel HTTP Client技巧有哪些


本文小编为大家详细介绍“Laravel HTTP Client技巧有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel HTTP Client技巧有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 作为web开发人员,我们经常需要与来自Laravel应用程序的api进行交互。在Laravel HTTP客户端版本7中提供了一个方便而直观的Guzzle HTTP库包装器。在本文中,我们将探讨使用Laravel HTTP Client的五个有价值的技巧,这些技巧可以使你的开发体验更加高效和愉快。这些技巧包括使用HTTP宏、为容器服务配置HTTP客户机、可移植的基本URL配置、防止测试中的杂发请求以及侦听HTTP事件。通过掌握这些技巧,你可以简化API交互并创建更健壮和可维护的Laravel应用程序。Laravel 的许多服务都有一个特性,允许你为应用程序定义自定义方法。你可以将这免费云主机域名些宏添加到服务提供者的boot()方法中,而不是从 Laravel 框架扩展核心类。HTTP 文档中展示了一个宏的示例,你可以使用它来定义常见的设置:

publicfunctionboot():void
{
Http::macro('github',function(){
returnHttp::withHeaders([
'X-Example'=>'example',
])->baseUrl('https://github.com');
});
}

//Usage
response=Http::github()->get('/');

宏可以定义任何你想在应用程序中定义和重复使用的便捷方法。文档中的宏示例涉及到了另一个配置 HTTP 客户端用于在其他服务中使用的提示。在下一节中,我们将重温将宏与传递客户端到其他容器服务相结合的方法。在 Laravel 应用程序中与 API 交互时,你可能希望为客户端配置各种可配置的设置。例如,如果 API 具有多个环境,则需要配置基本 URL、令牌、超时设置等。我们可以利用宏来定义客户端,将客户端表示为自己的服务,然后将其注入到其他服务中,或者两者都有。首先,让我们看看如何在服务提供者的 register() 方法中定义客户端设置:

publicfunctionregister():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'));

returnnewExampleService($client);
});
}

在单例服务定义中,我们链式调用了一些调用以配置客户端。结果是一个 PendingRequest 实例,我们可以将其传递给我们的服务构造函数,如下所示:

classExampleService
{
publicfunction__construct(
privatePendingRequest$client
){}

publicfunctiongetWidget(string$uid)
{
$response=$this->client
->withUrlParameters(['uid'=>$uid])
->get('widget/{uid}');

returnnewWidget($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'));

returnnewExampleService($client);
});

或者,如果你想将宏与服务相结合,可以在你的 AppServiceProviderboot() 方法中使用你定义的宏:

$this->app->singleton(ExampleService::class,function(Application$app){
returnnewExampleService(Http::github());
});

你可能已经看到默认的基础 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'),
]);

//Runtestcode
//IfanyothercodetriggersanHTTPcallviaLaravel'sclient
//anexceptionisthrown.

在我看来,使用 preventStrayRequests() 的最好方法是在你期望与 API 交互的测试类中定义一个 setUp() 方法。也许你也可以把它添加到你的应用程序的基础 TestCase 类中。

namespaceTests;

useIlluminateFoundationTestingTestCaseasBaseTestCase;
useIlluminateSupportFacadesHttp;

abstractclassTestCaseextendsBaseTestCase
{
useCreatesApplication;

publicfunctionsetUp():void
{
parent::setUp();

Http::preventStrayRequests();
}
}

这样做将确保你的测试套件中触发的每个 HTTP 客户端调用都有一个假的请求支持。使用这种方法给了我很大的信心,我已经在我的测试中用一个等价的假请求覆盖了我所有的出站请求。Laravel 的 HTTP 客户端有很多有价值的事件,你可以用它们来快速挖掘请求/响应生命周期的重要阶段。在写这篇文章的时候,有三个事件被触发:IlluminateHttpClientEventsRequestSendingIlluminateHttpClientEventsResponseReceivedIlluminateHttpClientEventsConnectionFailed比方说,你想把你的应用程序发出请求的每个 URL 都可视化。我们可以很容易地接入 RequestSending 事件,并记录出每个请求。

namespoaceApp/Listeners;

useIlluminateContractsQueueShouldQueue;
useIlluminateQueueInteractsWithQueue;
useIlluminateSupportFacadesLog;

classLogRequestSending
{
publicfunctionhandle(object$event):void
{
Log::debug('HTTP请求正在发送。',['url'=>$event->request->url()
'url'=>$event->request->url(),
]);
}
}

为了使事件处理程序工作,在 EventServiceProvider 类中添加以下内容。

useAppListenersLogRequestSending;
useIlluminateHttpClientEventsRequestSending;
//...
protected$listen=[
Registered::class=>[
SendEmailVerificationNotification::class,
],
RequestSending::class=>[
LogRequestSending::class,
],
];

一旦它被连接起来,你就会在你的日志中看到类似于 HTTP 客户端尝试的每个请求的内容。

[2023-03-1704:06:03]local.DEBUG:HTTP请求正在被发送。{"url":"https://api.example.com/v1/widget/123"}

读到这里,这篇“Laravel HTTP Client技巧有哪些”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: Linux进程间通信怎么实现

这篇文章主要讲解了“Linux进程间通信怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux进程间通信怎么实现”吧!共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,两个不同的进程A、B…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/31 14:20
Next 05/31 14:40

相关推荐