如何使用 Laravel 內置客戶端與外部 API 交互
已發表: 2023-04-24Laravel 使 API 交互對於新手和有經驗的 Web 開發人員來說都變得輕而易舉。 Larvel HTTP 客戶端構建在 PHP 的 Guzzle HTTP 客戶端之上,為開發人員提供更流暢的 HTTP 請求體驗。 其主要功能包括身份驗證、路由和有效的對象關係映射 (ORM)。
本文將探索使用 Laravel 的 HTTP 客戶端發出請求、調試響應、創建中間件和宏等。
Laravel HTTP Client 為您完成 API 的艱苦工作
Guzzle 是一個簡單的 PHP HTTP 客戶端。 它為不同的表單請求提供功能,包括GET
、 POST
、 PUT
和DELETE
以及流功能和多部分請求。 使用 Guzzle HTTP 客戶端,可以向服務器發送同步和異步請求。 此外,它還帶有合適的中間件來定制客戶端的行為。
Laravel 的 HTTP 客戶端是一個基於 Guzzle 構建的包裝器,但具有額外的功能。 它包括對重試失敗請求的支持和一些帶有 JSON 數據的輔助函數。 Laravel HTTP 客戶端的大部分功能與 Guzzle 相似。
先決條件
在接下來的部分中,您將了解有關 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
。 單擊發送後,您將看到以下響應:
並發請求
並行請求可以顯著提高性能,因為您可以在同一時期獲取更多數據。 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 及其響應。 輔助函數包括json 、 getJson 、 postJson 、 putJson 、 patchJson 、 deleteJson等。
為了更好地理解測試,為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
測試完成後,您會看到它運行了兩個測試,都成功了。
同樣,您可以檢查不同類型的請求並使用其他輔助方法進行更複雜的測試。
如何處理事件
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) { } }
終端打印狀態碼的信息日誌。
概括
無論網站或 Web 應用程序是由組織還是獨立開發人員製作的,API 都是其成功的關鍵。 但是,使用它們可能很困難。
許多框架和庫承諾會簡化這個過程,但 Laravel 以其對簡單性和易用性的關注而脫穎而出。 他們的內置客戶端支持簡單的 API 調用、並發 API 調用、API 宏、基於 JSON 的 API 的輔助方法等。