이 기사에서는 Laravel HTTP 클라이언트에 대한 5가지 팁을 주로 공유합니다. 관심 있는 분들은 아래 내용을 살펴보시면 도움이 될 것입니다.
웹
개발자로서 우리는 Laravel
애플리케이션에서 api
와 상호작용해야 하는 경우가 많습니다. Guzzle HTTP
라이브러리에 대한 편리하고 직관적인 래퍼는 Laravel HTTP
클라이언트 버전 7
에서 제공됩니다. 이 글에서는 개발 경험을 더욱 효율적이고 즐겁게 만들 수 있는 Laravel HTTP 클라이언트
사용에 대한 다섯 가지 유용한 팁을 살펴보겠습니다. web
开发人员,我们经常需要与来自Laravel
应用程序的api
进行交互。在Laravel HTTP
客户端版本7
中提供了一个方便而直观的Guzzle HTTP
库包装器。在本文中,我们将探讨使用Laravel HTTP Client
的五个有价值的技巧,这些技巧可以使你的开发体验更加高效和愉快。
这些技巧包括使用HTTP
宏、为容器服务配置HTTP
客户机、可移植的基本URL
配置、防止测试中的杂发请求以及侦听HTTP
事件。通过掌握这些技巧,你可以简化API
交互并创建更健壮和可维护的Laravel
应用程序。
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 客户端用于在其他服务中使用的提示。
在下一节中,我们将重温将宏与传递客户端到其他容器服务相结合的方法。
在 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 包含一个尾随的 /
,根据 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
HTTP
매크로 사용, 컨테이너 서비스용 HTTP
클라이언트 구성, 이식 가능한 기본 URL
구성, 테스트 시 혼란 방지가 포함됩니다. HTTP
이벤트를 수신합니다. 이러한 기술을 익히면 API
상호 작용을 단순화하고 더욱 강력하고 유지 관리가 쉬운 Laravel
애플리케이션을 만들 수 있습니다. HTTP 매크로많은 Laravel 서비스에는 애플리케이션에 대한 사용자 정의 방법을 정의할 수 있는 매크로
기능이 있습니다. Laravel 프레임워크에서 핵심 클래스를 확장하는 대신 서비스 제공자의 boot()
메서드에 이러한 매크로를 추가할 수 있습니다. HTTP 문서에는 일반 설정을 정의하는 데 사용할 수 있는 매크로의 예가 나와 있습니다. 🎜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(); } }
register()
메서드에서 클라이언트 설정을 정의하는 방법을 살펴보겠습니다. 🎜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(), ]); } }
PendingRequest
인스턴스이며, 다음과 같이 서비스 생성자에 전달할 수 있습니다. 🎜use App\Listeners\LogRequestSending; use Illuminate\Http\Client\Events\RequestSending; // ... protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], RequestSending::class => [ LogRequestSending::class, ], ];
withOptions()
메서드를 사용하여 Guzzle 옵션을 직접 구성하지만 HTTP 클라이언트에서 제공하는 몇 가지 편리한 방법을 사용할 수도 있습니다. 🎜[2023-03-17 04:06:03] local.DEBUG: HTTP请求正在被发送。{"url": "https://api.example.com/v1/widget/123"}
AppServiceProvider
의 boot()<에서 수행할 수 있습니다. 정의된 매크로를 사용하는 /code> 메소드: 🎜rrreee🎜이식 가능한 기본 URL 구성🎜🎜<a href=" https://에 따라 기본 기본 URL에 후행 <code>/
가 포함되어 있음을 확인하실 수 있습니다. www.php.cn/link/e1390927a3211895fec6f0bc8f5c9f7d" rel="nofollow noopener noreferrer">RFC3986은 최대의 이식성을 제공합니다. 🎜🎜다음 서비스 구성을 예로 들어 보겠습니다(기본 base_url 참고). 🎜rrreee🎜우리 API에 프로덕션 및 테스트 환경에서 경로 접두어 /v1/
가 있는 경우 아마도 일 수 있습니다. https://stg-api.example.com/
; 후행 슬래시를 사용하면 코드를 변경하지 않고도 URL이 예상대로 작동합니다. 후행 /
를 구성하는 동안 내 코드의 모든 API 호출은 상대 경로를 사용합니다. 🎜rrreee🎜Guzzle의 클라이언트 문서를 작성하여 다양한 base_uri 스타일이 URI 구문 분석에 미치는 영향을 이해하세요. 🎜🎜테스트에서 잘못된 요청 방지🎜🎜Laravel의 HTTP 클라이언트는 테스트 작성을 쉽게 만들어주는 뛰어난 테스트 도구를 제공합니다. API와 상호 작용하는 코드를 작성할 때 어떤 면에서 테스트에 실제 네트워크 요청이 발생한다는 사실이 불안합니다. Laravel의 HTTP 클라이언트를 사용하여 Prevent Stray Requests를 입력하세요. 🎜rrreee🎜 제 생각에는 preventStryRequests( )</code를 사용하세요. >는 API와 상호작용할 것으로 예상되는 테스트 클래스에 <code>setUp()
메서드를 정의하는 것입니다. 어쩌면 이를 애플리케이션의 기본 TestCase
클래스에 추가할 수도 있습니다. 🎜rrreee🎜이렇게 하면 테스트 모음에서 실행된 모든 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
위 내용은 Laravel HTTP 클라이언트 팁 5가지 분석 및 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!