這篇文章為大家帶來了關於Laravel的相關知識,其中主要跟大家分享5個Laravel HTTP Client的小技巧,有興趣的朋友下面一起來看一下吧,希望對大家有幫助。
身為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
類別中。
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 用戶端呼叫都有一個假的請求支援。使用這種方法給了我很大的信心,我已經在我的測試中用一個等價的假請求覆蓋了我所有的出站請求。
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 应用程序中使用。
以上是分析總結5個Laravel HTTP Client小技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!