Laravel HTTP 클라이언트 팁 5가지 분석 및 요약
이 기사에서는 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
应用程序。
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
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP의 데이터베이스 작업은 객체를 관계형 데이터베이스에 매핑하는 ORM을 사용하여 단순화됩니다. Laravel의 EloquentORM을 사용하면 객체 지향 구문을 사용하여 데이터베이스와 상호 작용할 수 있습니다. 모델 클래스를 정의하거나 Eloquent 메소드를 사용하거나 실제로 블로그 시스템을 구축하여 ORM을 사용할 수 있습니다.

Laravel 9 및 CodeIgniter 4의 최신 버전은 업데이트된 기능과 개선 사항을 제공합니다. Laravel9은 MVC 아키텍처를 채택하여 데이터베이스 마이그레이션, 인증, 템플릿 엔진 등의 기능을 제공합니다. CodeIgniter4는 HMVC 아키텍처를 사용하여 라우팅, ORM 및 캐싱을 제공합니다. 성능면에서는 Laravel9의 서비스 제공자 기반 디자인 패턴과 CodeIgniter4의 경량 프레임워크가 뛰어난 성능을 제공합니다. 실제 애플리케이션에서 Laravel9은 유연성과 강력한 기능이 필요한 복잡한 프로젝트에 적합한 반면, CodeIgniter4는 빠른 개발 및 소규모 애플리케이션에 적합합니다.

Laravel과 CodeIgniter의 데이터 처리 기능을 비교해 보세요. ORM: Laravel은 클래스-객체 관계형 매핑을 제공하는 EloquentORM을 사용하는 반면, CodeIgniter는 데이터베이스 모델을 PHP 클래스의 하위 클래스로 표현하기 위해 ActiveRecord를 사용합니다. 쿼리 빌더: Laravel에는 유연한 체인 쿼리 API가 있는 반면, CodeIgniter의 쿼리 빌더는 더 간단하고 배열 기반입니다. 데이터 검증: Laravel은 사용자 정의 검증 규칙을 지원하는 Validator 클래스를 제공하는 반면, CodeIgniter는 내장된 검증 기능이 적고 사용자 정의 규칙을 수동으로 코딩해야 합니다. 실제 사례: 사용자 등록 예시에서는 Lar를 보여줍니다.

Laravel - Artisan Commands - Laravel 5.7은 새로운 명령을 처리하고 테스트하는 새로운 방법을 제공합니다. 여기에는 장인 명령을 테스트하는 새로운 기능이 포함되어 있으며 데모는 아래에 언급되어 있습니다.

초보자의 경우 CodeIgniter는 학습 곡선이 더 완만하고 기능이 적지만 기본적인 요구 사항을 충족합니다. Laravel은 더 넓은 기능 세트를 제공하지만 학습 곡선이 약간 더 가파릅니다. 성능면에서는 Laravel과 CodeIgniter 모두 좋은 성능을 보입니다. Laravel은 보다 광범위한 문서와 적극적인 커뮤니티 지원을 제공하는 반면 CodeIgniter는 더 간단하고 가벼우며 강력한 보안 기능을 갖추고 있습니다. 블로그 애플리케이션을 구축하는 실제 사례에서 Laravel의 EloquentORM은 데이터 조작을 단순화하는 반면 CodeIgniter는 더 많은 수동 구성이 필요합니다.

대규모 프로젝트를 위한 프레임워크를 선택할 때 Laravel과 CodeIgniter는 각각 고유한 장점을 가지고 있습니다. Laravel은 엔터프라이즈급 애플리케이션을 위해 설계되었으며 모듈식 디자인, 종속성 주입 및 강력한 기능 세트를 제공합니다. CodeIgniter는 속도와 사용 편의성을 강조하여 중소 규모 프로젝트에 더 적합한 경량 프레임워크입니다. 요구 사항이 복잡하고 사용자 수가 많은 대규모 프로젝트의 경우 Laravel의 성능과 확장성이 더 적합합니다. 간단한 프로젝트나 리소스가 제한된 상황에서는 CodeIgniter의 가볍고 빠른 개발 기능이 더 이상적입니다.

마이크로서비스 아키텍처는 PHP 프레임워크(예: Symfony 및 Laravel)를 사용하여 마이크로서비스를 구현하고 RESTful 원칙 및 표준 데이터 형식에 따라 API를 설계합니다. 마이크로서비스는 메시지 대기열, HTTP 요청 또는 gRPC를 통해 통신하고 모니터링 및 문제 해결을 위해 Prometheus 및 ELKStack과 같은 도구를 사용합니다.

소규모 프로젝트의 경우 Laravel은 강력한 기능과 보안이 필요한 대규모 프로젝트에 적합합니다. CodeIgniter는 가볍고 사용하기 쉬운 매우 작은 프로젝트에 적합합니다.
