分析总结5个Laravel HTTP Client小技巧
本篇文章给大家带来了关于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); });
或者,如果你想将宏与服务相结合,可以在你的 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 的创建客户端文档,了解不同的 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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

使用ORM可简化PHP中的数据库操作,它将对象映射到关系数据库中。Laravel中的EloquentORM允许使用面向对象的语法与数据库交互,可通过定义模型类、使用Eloquent方法或在实战中构建博客系统等方式来使用ORM。

Laravel9和CodeIgniter4的最新版本提供了更新的特性和改进。Laravel9采用MVC架构,提供数据库迁移、身份验证和模板引擎等功能。CodeIgniter4采用HMVC架构,提供路由、ORM和缓存。在性能方面,Laravel9的基于服务提供者设计模式和CodeIgniter4的轻量级框架使其具有出色的性能。在实际应用中,Laravel9适用于需要灵活性和强大功能的复杂项目,而CodeIgniter4适用于快速开发和小型应用程序。

Laravel - Artisan 命令 - Laravel 5.7 提供了处理和测试新命令的新方法。它包括测试 artisan 命令的新功能,下面提到了演示?

比较Laravel和CodeIgniter的数据处理能力:ORM:Laravel使用EloquentORM,提供类对象关系映射,而CodeIgniter使用ActiveRecord,将数据库模型表示为PHP类的子类。查询构建器:Laravel具有灵活的链式查询API,而CodeIgniter的查询构建器更简单,基于数组。数据验证:Laravel提供了一个Validator类,支持自定义验证规则,而CodeIgniter的验证功能内置较少,需要手动编码自定义规则。实战案例:用户注册示例展示了Lar

对于初学者来说,CodeIgniter的学习曲线更平缓,功能较少,但涵盖了基本需求。Laravel提供了更广泛的功能集,但学习曲线稍陡。在性能方面,Laravel和CodeIgniter都表现出色。Laravel具有更广泛的文档和活跃的社区支持,而CodeIgniter更简单、轻量级,具有强大的安全功能。在建立博客应用程序的实战案例中,Laravel的EloquentORM简化了数据操作,而CodeIgniter需要更多的手动配置。

在选择大型项目框架时,Laravel和CodeIgniter各有优势。Laravel针对企业级应用程序而设计,提供模块化设计、依赖项注入和强大的功能集。CodeIgniter是一款轻量级框架,更适合小型到中型项目,强调速度和易用性。对于具有复杂需求和大量用户的大型项目,Laravel的强大功能和可扩展性更合适。而对于简单项目或资源有限的情况下,CodeIgniter的轻量级和快速开发能力则更为理想。

PHP单元和集成测试指南单元测试:关注单个代码单元或函数,使用PHPUnit创建测试用例类进行验证。集成测试:关注多个代码单元协同工作的情况,使用PHPUnit的setUp()和tearDown()方法设置和清理测试环境。实战案例:使用PHPUnit在Laravel应用中进行单元和集成测试,包括创建数据库、启动服务器以及编写测试代码。

对于小型项目,Laravel适用于大型项目,需要强大的功能和安全性。CodeIgniter适用于非常小的项目,需要轻量级和易用性。
