分析总结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');    });}// Usageresponse = 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\RequestSendingIlluminateHttpClient\Events\ResponseReceivedIlluminateHttpClient\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小技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/65504.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Win10按win+r没有反应怎么办?
上一篇 2025年11月12日 01:09:21
为应对麒麟9030性能大幅提升:华为要为Mate 80内置散热风扇!
下一篇 2025年11月12日 01:12:24

相关推荐

  • laravel是什么意思

    laravel是什么意思laravel是什么意思laravel是什么意思laravel是什么意思

    laravel 是使用 php 语言编写的网页程序开发框架,目的是为开发者提供常用组件,简化网页程序的开发。只需编写较少的代码,就能实现其他编程语言或框架难以企及的功能。经验丰富的 php 程序员会发现,laravel 让程序开发变得更有乐趣。 Laravel 哲学 Laravel 是一套富有表达性…

    2026年9月26日 • 用户投稿
    400
  • laravel框架为什么流行?

    laravel框架为什么流行?laravel框架为什么流行?laravel框架为什么流行?laravel框架为什么流行?

    laravel是一个有着美好前景的年轻框架,它的社区充满着活力,相关的文档和教程完整而清晰,并为快速、安全地开发现代应用程序提供了必要的功能。在近几年对php 框架流行度的统计中,laravel始终遥遥领先。那么laravel框架为什么会流行? Laravel的功能: 模块化和可扩展性 Larave…

    2026年9月26日 • 用户投稿
    700
  • laravel数据库迁移报错

    laravel数据库迁移报错laravel数据库迁移报错laravel数据库迁移报错laravel数据库迁移报错

    问题描述 (1)laravel 5.4或者更高版本 改变了默认的数据库字符集,现在utf8mb4包括存储emojis支持。如果你运行MySQL v5.7.7或者更高版本,则不需要做任何事情。(2)当你试着在一些MariaDB或者一些老版本的的MySQL上运行 migrations 命令时,你可能会碰…

    2026年9月26日 • 用户投稿
    200
  • 十个推荐使用的Laravel的辅助函数

    十个推荐使用的Laravel的辅助函数十个推荐使用的Laravel的辅助函数十个推荐使用的Laravel的辅助函数十个推荐使用的Laravel的辅助函数

    array_dot() 函数允许你将多维数组转换为使用点符号的一维数组。 $array = [ ‘user’ => [‘username’ => ‘something’], ‘app’ => [‘creator’ => [‘name’ => ‘someone’], ‘c…

    2026年9月26日 • 用户投稿
    000
  • laravel如何引用外部文件

    laravel如何引用外部文件laravel如何引用外部文件laravel如何引用外部文件laravel如何引用外部文件

    (1)、首先在appHttproutes.php中定义路由; Route::get(‘view’,’ViewController@view’);Route::get(‘article’,’ViewController@article’);Route::get(‘layout’,’ViewContro…

    2026年9月26日 • 用户投稿
    500
  • Model保留ID的情况下对外提供UUID

    Model保留ID的情况下对外提供UUIDModel保留ID的情况下对外提供UUIDModel保留ID的情况下对外提供UUIDModel保留ID的情况下对外提供UUID

    在某些应用程序中,不暴露 ID 可以避免别人轻易获悉你数据库里模型的数量。 译者注:隐藏 ID 也可有效防止用户恶意遍历网站的内容。 嘿, 想象一下,在我的 Podcast 应用程序中,我设置了一个默认 id 在 Laravel 的 Podcast 模型中,它是一个整数,每次插入一行时都会自动增加一…

    2026年9月26日 • 用户投稿
    100
  • laravel路由里的scope是什么

    laravel路由里的scope是什么laravel路由里的scope是什么laravel路由里的scope是什么laravel路由里的scope是什么

    laravel路由里的scope是什么? laravel中的scope作用域 laravel中在模板中处理(属于不属于)的数据(增删改查),引入了scope来处理 也就是在模板定义方法中,加上前缀scope。 简言之,Laravel中模型中可以定义scope开头方法,这类方法可以通过模型直接调用。这…

    2026年9月26日 • 用户投稿
    000
  • 使用 Git 实现 Laravel 项目的自动化部署

    使用 Git 实现 Laravel 项目的自动化部署使用 Git 实现 Laravel 项目的自动化部署使用 Git 实现 Laravel 项目的自动化部署使用 Git 实现 Laravel 项目的自动化部署

    简介 在我们的开发过程中,我们不可避免的会用到版本控制。当然,这也致使你对 Git 和 SVN 有所了解。两者都是出色的版本控制工具,我个人比较习惯用 Git,当然这可能和个人习惯有关。不知道大家一开始是怎么使用 git 进行开发的,反正我个人是先将代码提交到 github 仓库,然后用 SSH 登…

    2026年9月26日 • 用户投稿
    900
  • Laravel中利用Scout集成Elasticsearch搜索引擎

    写在前面 Elasticsearch(以下简称es)是一个实时的分布式搜索和分析引擎。 在搜索引擎方面,不仅仅有Elasticsearch,像另一篇提到的Algolia,还有sphinx、Solr等等,这里不做评价和比较,本篇主要介绍laravel中如何使用Elasticsearch。 首选必须安装…

    2026年9月26日
    100
  • laravel和其他框架的区别

    laravel和其他框架的区别laravel和其他框架的区别laravel和其他框架的区别laravel和其他框架的区别

    今天就为大家分享一篇laravel框架与其他框架的详细对比,具有很好的参考价值,希望对大家有所帮助。 优点:     (推荐学习:laravel开发) 1、代码比较明白易懂,跟英语句子差不多,关键词就是函数,举个例子,获取数据库中某个表的所有数据: $article=new Article;$art…

    2026年9月25日 • 用户投稿
    000
  • laravel的passport和jwt的区别

    laravel的passport和jwt的区别laravel的passport和jwt的区别laravel的passport和jwt的区别laravel的passport和jwt的区别

    简介 Passport是一个Node.js中间件,它提供了易于实现的各种不同的请求身份验证策略。默认情况下,它将用户对象存储在会话中。    (推荐学习:laravel开发) JSON Web令牌是一种身份验证标准,通过在有助于识别登录用户的请求中分配和传递加密令牌,而不是将用户存储在服务器上的会话…

    2026年9月25日 • 用户投稿
    200
  • laravel和tp5的区别

    laravel和tp5的区别laravel和tp5的区别laravel和tp5的区别laravel和tp5的区别

    Laravel框架:     (推荐学习:laravel开发) Lavavel一直秉承着优雅的原则,很好的支持了composer,实现了更丰富的扩展,社区文档活跃,相较于TP,Lavavel更庞大,安全性也更高,更适合开发大中型项目,被称为“巨匠型开发框架”。 在Laravel中已经具有了一套高级的…

    2026年9月25日 • 用户投稿
    000
  • laravel和thinkphp路由区别

    laravel和thinkphp路由区别laravel和thinkphp路由区别laravel和thinkphp路由区别laravel和thinkphp路由区别

    laravel路由有如下这些功能: 基本路由路由重定向 视图路由路由参数必填参数 可选参数 正则表达式约束命名路由路由组中间件 命名空间 子域名路由 路由前缀 路由命名前缀路由模型绑定隐式绑定 显式绑定频率限制表单方法伪造访问当前路由  (推荐学习:laravel开发) 所有 Laravel 路由都…

    2026年9月25日 • 用户投稿
    000
  • Laravel 邮件推送系统异常

    Laravel 邮件推送系统异常Laravel 邮件推送系统异常Laravel 邮件推送系统异常Laravel 邮件推送系统异常

    前言: 在日常开发中,我们可能会写出一些 bug,但是项目已经上线了,我们无法第一时间得到客户的反馈,这时候邮件报错系统就派上用场了,我们都知道 laravel 的异常处理都需要通过 Handler.php 文件来处理,那么就从此处开始入手 1、在 report 的方法里判断是否需要发送邮件,代码如…

    2026年9月25日 • 用户投稿
    000
  • laravel怎么清除应用的所有缓存_laravel应用缓存清理方法

    Laravel应用响应异常或配置未生效时,需清除缓存。依次执行php artisan route:clear、config:clear、view:clear和cache:clear命令,可分别清除路由、配置、视图及应用缓存,确保修改生效。 如果您发现 Laravel 应用响应异常或配置更改未生效,可…

    2026年9月25日
    200
  • 参加PHP+MySQL就业培训后能获得的岗位有哪些

    参加php+mysql就业培训后,你可以获得以下岗位:1. web开发工程师,利用php和mysql开发动态网站和web应用程序;2. 后端开发工程师,使用php构建后端服务和api;3. 全栈开发工程师,结合前端技术进行全站开发;4. 数据库管理员,负责mysql数据库的设计、优化和维护;5. 软…

    2026年9月25日
    500
  • Laravel 中Eloquent ORM 相关操作

    定义 操作 获取(查询) 获取集合,(查询列表) 返回值是 IlluminateDatabaseEloquentCollection 的一个实例 获取所有的数据 use AppUser;$users = User::all(); 条件获取列表 $users = User::where(‘active…

    2026年9月25日
    600
  • 利用Laravel高效串联查询:从上一个结果获取数据

    本教程旨在解决laravel中基于前一个查询结果进行后续查询的常见问题。文章详细阐述了如何避免因`take(1)->toarray()`导致的多维数组问题,并优化了查询效率,通过使用`first()`方法获取单个记录,并直接在数据库层面进行过滤,而非在内存中处理大量数据,从而提升应用性能和代码…

    2026年9月24日
    700
  • laravel怎么在模型中定义远程一对一或一对多关系_laravel模型远程关联定义方法

    使用 hasManyThrough 和 hasOneThrough 可在 Laravel 中实现通过中间模型访问远端数据,需确保外键正确或自定义键名以维持关联完整性。 如果您需要在 Laravel 模型中访问通过中间模型关联的远端数据,但两个模型之间没有直接关系,而是通过第三个模型连接,则可以使用“…

    2026年9月24日
    000
  • MySQL中SQL注入防范 SQL注入攻击的预防与应对措施

    sql注入的防范核心在于参数化查询。具体措施包括:1.始终使用参数化查询,将用户输入视为数据而非可执行代码;2.对输入进行过滤与校验,如验证格式、转义特殊字符;3.遵循最小权限原则,限制数据库账号权限;4.控制错误信息输出,避免暴露敏感细节;5.定期更新框架与插件,及时修补漏洞。这些方法结合使用能有…

    2026年9月24日
    100

发表回复

登录后才能评论
关注微信