本文小編為大家詳細介紹“Laravel HTTP Client技巧有哪些”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“Laravel HTTP Client技巧有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供紅橋網(wǎng)站建設、紅橋做網(wǎng)站、紅橋網(wǎng)站設計、紅橋網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、紅橋企業(yè)網(wǎng)站模板建站服務,十余年紅橋做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
作為web
開發(fā)人員,我們經(jīng)常需要與來自Laravel
應用程序的api
進行交互。在Laravel HTTP
客戶端版本7
中提供了一個方便而直觀的Guzzle HTTP
庫包裝器。在本文中,我們將探討使用Laravel HTTP Client
的五個有價值的技巧,這些技巧可以使你的開發(fā)體驗更加高效和愉快。
這些技巧包括使用HTTP
宏、為容器服務配置HTTP
客戶機、可移植的基本URL
配置、防止測試中的雜發(fā)請求以及偵聽HTTP
事件。通過掌握這些技巧,你可以簡化API
交互并創(chuàng)建更健壯和可維護的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 客戶端用于在其他服務中使用的提示。
在下一節(jié)中,我們將重溫將宏與傳遞客戶端到其他容器服務相結(jié)合的方法。
在 Laravel 應用程序中與 API 交互時,你可能希望為客戶端配置各種可配置的設置。例如,如果 API 具有多個環(huán)境,則需要配置基本 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);
});
}
在單例服務定義中,我們鏈式調(diào)用了一些調(diào)用以配置客戶端。結(jié)果是一個 PendingRequest
實例,我們可以將其傳遞給我們的服務構(gòu)造函數(shù),如下所示:
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);
});
或者,如果你想將宏與服務相結(jié)合,可以在你的 AppServiceProvider
的 boot()
方法中使用你定義的宏:
$this->app->singleton(ExampleService::class, function (Application $app) {
return new ExampleService(Http::github());
});
你可能已經(jīng)看到默認的基礎 URL 包含一個尾隨的 /
,根據(jù) 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 在生產(chǎn)和測試環(huán)境中有一個路徑前綴 /v1/
,也許它只是 https://stg-api.example.com/
; 使用尾部斜線可以使 URL 按預期工作,而不會更改代碼。在配置尾部 /
的同時,請注意,我的代碼中的所有 API 調(diào)用都使用相對路徑:
$this->client
->withUrlParameters(['uid' => $uid])
// 例子:
// 測試環(huán)境 - https://stg-api.example.com/widget/123
// 生產(chǎn)環(huán)境 - https://api.example.com/v1/widget/123
->get('widget/{uid}');
請參閱 Guzzle 的創(chuàng)建客戶端文檔,了解不同的 base_uri 風格是如何影響 URI 的解析的。
Laravel 的 HTTP 客戶端提供了優(yōu)秀的測試工具,使編寫測試變得輕而易舉。當我寫與 API 交互的代碼時,我感到不安的是我的測試在某種程度上有實際的網(wǎng)絡請求發(fā)生。進入防止雜散請求與 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();
}
}
這樣做將確保你的測試套件中觸發(fā)的每個 HTTP 客戶端調(diào)用都有一個假的請求支持。使用這種方法給了我很大的信心,我已經(jīng)在我的測試中用一個等價的假請求覆蓋了我所有的出站請求。
Laravel 的 HTTP 客戶端有很多有價值的事件,你可以用它們來快速挖掘請求/響應生命周期的重要階段。在寫這篇文章的時候,有三個事件被觸發(fā):
Illuminate\HttpClient\Events\RequestSending
IlluminateHttpClient\Events\ResponseReceived
IlluminateHttpClient\EventsConnectionFailed
比方說,你想把你的應用程序發(fā)出請求的每個 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請求正在發(fā)送。', ['url' => $event->request->url()
'url' => $event->request->url(),
]);
}
}
為了使事件處理程序工作,在 EventServiceProvider
類中添加以下內(nèi)容。
use App\Listeners\LogRequestSending;
use Illuminate\Http\Client\Events\RequestSending;
// ...
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
RequestSending::class => [
LogRequestSending::class,
],
];
一旦它被連接起來,你就會在你的日志中看到類似于 HTTP 客戶端嘗試的每個請求的內(nèi)容。
[2023-03-17 04:06:03] local.DEBUG: HTTP請求正在被發(fā)送。{"url": "https://api.example.com/v1/widget/123"}
讀到這里,這篇“Laravel HTTP Client技巧有哪些”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。