如何使用 Laravel 內置客戶端與外部 API 交互

已發表: 2023-04-24

Laravel 使 API 交互對於新手和有經驗的 Web 開發人員來說都變得輕而易舉。 Larvel HTTP 客戶端構建在 PHP 的 Guzzle HTTP 客戶端之上,為開發人員提供更流暢的 HTTP 請求體驗。 其主要功能包括身份驗證、路由和有效的對象關係映射 (ORM)。

本文將探索使用 Laravel 的 HTTP 客戶端發出請求、調試響應、創建中間件和宏等。

Laravel HTTP Client 為您完成 API 的艱苦工作

Guzzle 是一個簡單的 PHP HTTP 客戶端。 它為不同的表單請求提供功能,包括GETPOSTPUTDELETE以及流功能和多部分請求。 使用 Guzzle HTTP 客戶端,可以向服務器發送同步和異步請求。 此外,它還帶有合適的中間件來定制客戶端的行為。

Laravel 的 HTTP 客戶端是一個基於 Guzzle 構建的包裝器,但具有額外的功能。 它包括對重試失敗請求的支持和一些帶有 JSON 數據的輔助函數。 Laravel HTTP 客戶端的大部分功能與 Guzzle 相似。

充分利用 Laravel 的內置客戶端進行 API 交互! API 新手? 本指南已為您介紹點擊推文

先決條件

在接下來的部分中,您將了解有關 Laravel 的 HTTP 客戶端的更多信息。 要繼續,您將需要:

  • Laravel、PHP 和 API 的基礎知識
  • 安裝了 PHP 和 Composer
  • 郵差

如何提出要求

要了解如何使用 HTTP 客戶端發出請求,您可以利用大量託管 API,例如 ReqRes。

首先導入創建應用程序時包含的 HTTP 包。 在App/Http/Controllers/UserController.php文件中,添加以下代碼,從文件開頭的 use 語句開始,剩下的代碼在 index 函數中。

 use Illuminate\Support\Facades\Http; return Http::get("https://reqres.in/api/users?page=2");

注意:對於復雜的用例,您還可以使用withHeaders方法發送帶有標頭的請求。

在同一文件中,使用以下代碼創建一個新的方法帖子:

 function post() { $response = Http::withHeaders([ 'Content-Type' => 'application/json', ])->post('https://reqres.in/api/users', [ 'name' => 'morpheus', 'job' => 'leader', ]); return $response; }

然後在routes/web.php文件中為它添加一個路由:

 Route::get('post',[UserController::class,'post']);

現在,可以使用 Postman 來測試這條路由。 打開 Postman 並添加 http://127.0.0.1:8000/post 作為 URL,請求類型為GET 。 單擊發送後,您將看到以下響應:

使用 Postman 發出請求
使用 Postman 發出請求

並發請求

並行請求可以顯著提高性能,因為您可以在同一時期獲取更多數據。 Laravel 的 HTTP 客戶端可以使用 pool 方法執行並發請求。

App/Http/Controllers/UserController.php中,添加以下代碼:

 use Illuminate\Http\Client\Pool; function concurrent() { $responses = Http::pool(fn (Pool $pool) => [ $pool->get('https://reqres.in/api/users?page=2'), $pool->get('https://reqres.in/api/users/2'), $pool->get('https://reqres.in/api/users?page=2'), ]); return $responses[0]->ok() && $responses[1]->ok() && $responses[2]->ok(); }

然後,在routes/web.php文件中添加支持路由。

 Route::get('concurrent',[UserController::class,'concurrent']);

訪問路由時,瀏覽器給出如下響應:

並發請求
並發請求

請求宏

請求宏在與通用 API 路徑交互時很有用。

要創建宏,您需要使用以下代碼在app/Http/Providers/AppServiceProvider.php文件的引導方法中定義宏:

 use Illuminate\Support\Facades\Http; Http::macro('reqres', function () { return Http::baseUrl('https://reqres.in/api'); });

注意:確保在文件開頭添加 use 語句。

然後,通過添加以下代碼在UserController中使用宏:

 function macro() { $response = Http::reqres()->get('/users?page=2'); return $response; }

如您所見,因為已經創建了宏,所以您不必再次添加完整的 URL。

最後,使用以下代碼在routes/web.php文件中添加一個路由:

 Route::get('macro',[UserController::class,'macro']);
宏請求
宏請求

如何解碼響應

要解碼響應並確保 API 請求成功,您可以使用客戶端中包含的狀態方法。 該方法獲取服務器發送的狀態碼並顯示出來。

要對此進行測試,請將之前的宏代碼替換為App/Http/Controllers/UserController.php文件中的以下代碼:

 function macro() { $response = Http::reqres()->get('/users?page=2'); return $response->status(); }

在這裡,狀態碼 200 表示請求成功。

解碼成功響應
解碼成功響應

如何測試 JSON API

Laravel 有幾個助手來測試 JSON API 及其響應。 輔助函數包括jsongetJsonpostJsonputJsonpatchJsondeleteJson等。

為了更好地理解測試,為GET用戶的路由創建一個測試場景。 當您引導 Laravel 應用程序時,示例測試已經創建。 在tests/Feature/ExampleTest.php文件中,將現有代碼替換為以下內容:

 <?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ExampleTest extends TestCase { /** * A basic test example. * * @return void */ public function test_example() { $response = $this->getJson('/users'); $response->assertStatus(200); } }

添加的代碼在用戶的路由中獲取 JSON 數據並檢查狀態代碼是否為 200。

添加測試代碼後,在終端中運行以下命令以運行測試:

 ./vendor/bin/phpunit

測試完成後,您會看到它運行了兩個測試,都成功了。

測試 JSON API
測試 JSON API

同樣,您可以檢查不同類型的請求並使用其他輔助方法進行更複雜的測試。

如何處理事件

Laravel 提供了三個在處理 HTTP 請求時觸發的事件。

  • RequestSending ,在發送請求之前。
  • ResponseReceived ,這是收到響應的時間。
  • ConnectionFailed ,即未收到響應時。

所有三個事件都包含$request屬性以檢查Illuminate\Http\Client\Request實例,並且ResponseReceived有一個額外的$response property 。 這些對於在事件發生後執行操作特別有用。 例如,您可能希望在收到成功回復後發送電子郵件。

要創建事件和偵聽器,請導航到app/Providers/EventServiceProvider.php文件並將偵聽數組替換為以下代碼。

 protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], 'Illuminate\Http\Client\Events\ResponseReceived' => [ 'App\Listeners\LogResponseReceived', ], ];

然後在終端中運行以下命令:

 php artisan event:generate

上面的命令將創建app/Listeners/LogResponseReceived.php監聽器。 用以下代碼替換該文件的代碼:

 <?php namespace App\Listeners; use Illuminate\Http\Client\Events\ResponseReceived; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\Log; class LogResponseReceived { /** * Create the event listener. * * @return void */ public function __construct(Request $request, Response $response) { Log::channel('stderr')->info($response->status()); } /** * Handle the event. * * @param \Illuminate\Http\Client\Events\ResponseReceived $event * @return void */ public function handle(ResponseReceived $event) { } }

終端打印狀態碼的信息日誌。

顯示狀態代碼的終端日誌
顯示狀態代碼的終端日誌

結合 Laravel 和 Guzzle 的強大功能以獲得無縫的 API 體驗。 準備好提升您的 Web 開發技能了嗎? 從這裡開始點擊鳴叫

概括

無論網站或 Web 應用程序是由組織還是獨立開發人員製作的,API 都是其成功的關鍵。 但是,使用它們可能很困難。

許多框架和庫承諾會簡化這個過程,但 Laravel 以其對簡單性和易用性的關注而脫穎而出。 他們的內置客戶端支持簡單的 API 調用、並發 API 調用、API 宏、基於 JSON 的 API 的輔助方法等。