Laravel使API交互對新的和有經(jīng)驗(yàn)的Web開發(fā)人員來說都是輕而易舉的。Larvel的HTTP客戶端是建立在PHP的Guzzle HTTP客戶端之上,讓開發(fā)者在進(jìn)行HTTP請求時(shí)有更順暢的體驗(yàn)。它的主要功能包括認(rèn)證, 路由, 和有效的對象關(guān)系映射(ORM).
本文將探討如何使用Laravel的HTTP客戶端來進(jìn)行請求, 調(diào)試響應(yīng), 創(chuàng)建中間件和宏, 以及更多。
Laravel HTTP客戶端為你的API工作
Guzzle是一個(gè)簡單的PHP的HTTP客戶端。它為不同
use Illuminate\Support\Facades\Http;
return Http::get("https://reqres.in/api/users?page=2");
的表單請求提供了功能,包括?GET
,?POST
,?PUT
, 和?DELETE
?,以及流媒體功能和多部分請求。使用Guzzle HTTP客戶端,可以向服務(wù)器發(fā)送同步和異步的請求。此外,它還配備了體面的中間件來定制客戶端的行為。
Laravel的HTTP客戶端是一個(gè)建立在Guzzle基礎(chǔ)上的封裝器,但具有額外的功能。它包括支持重試失敗的請求和一些JSON數(shù)據(jù)的輔助功能。Laravel HTTP客戶端的大部分功能都與Guzzle類似。
前提條件
在下面的章節(jié)中, 你會(huì)了解到更多關(guān)于Laravel的HTTP客戶端。要繼續(xù)學(xué)習(xí), 你需要:
- 有關(guān)Laravel, PHP, 和API的基本知識
- 安裝了PHP和Composer
- Postman
如何發(fā)出請求
要了解如何使用HTTP客戶端來發(fā)出請求, 你可以利用大量的托管API, 如ReqRes.
首先,導(dǎo)入創(chuàng)建應(yīng)用程序時(shí)包含的HTTP包。在App/Http/Controllers/UserController.php文件中,添加以下代碼,從文件開頭的use語句開始,其余代碼在index函數(shù)中。
Note:?對于復(fù)雜的用例,你也可以通過使用?withHeaders
?方法發(fā)送帶頭文件的請求。
在同一個(gè)文件中,使用下面的代碼創(chuàng)建一個(gè)新的方法帖子:
function post()
{
$response = Http::withHeaders([
'Content-Type' => 'application/json',
])->post('https://reqres.in/api/users', [
'name' => 'morpheus',
'job' => 'leader',
]);
return $response;
}
然后在routes/web.php文件中為其添加一個(gè)路由:
Route::get('post',[UserController::class,'post']);
現(xiàn)在,可以用Postman來測試這個(gè)路由。打開Postman,添加http://127.0.0.1:8000/post 作為URL,請求類型為?GET
?。一旦你點(diǎn)擊send,你會(huì)看到下面的響應(yīng):
使用Postman發(fā)出請求
并行請求
并發(fā)請求可以顯著提高性能,因?yàn)槟憧梢栽谕粫r(shí)間段內(nèi)獲取更多的數(shù)據(jù)。Laravel的HTTP客戶端使得使用pool方法進(jìn)行并發(fā)請求成為可能。
在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']);
瀏覽器在訪問該路由時(shí),會(huì)給出如下響應(yīng):
并發(fā)請求
請求宏
請求宏在與常見的API路徑進(jìn)行交互時(shí)非常有用。
要?jiǎng)?chuàng)建宏,你需要使用下面的代碼在App/Http/Controllers/UserController.php文件的啟動(dòng)方法內(nèi)定義宏:
use Illuminate\Support\Facades\Http;
Http::macro('reqres', function () {
return Http::baseUrl('https://reqres.in/api');
});
Note:請確保在文件的開頭添加使用語句。
然后,在?UserController
?里面使用這個(gè)宏,添加以下代碼:
function macro()
{
$response = Http::reqres()->get('/users?page=2');
return $response;
}
正如你所看到的,因?yàn)楹暌呀?jīng)被創(chuàng)建了,你不必再添加完整的URL。
最后,使用下面的代碼在routes/web.php文件中添加一個(gè)路由:
Route::get('macro',[UserController::class,'macro']);
宏請求
如何對響應(yīng)進(jìn)行解碼
要解碼一個(gè)響應(yīng)并確保一個(gè)API請求是成功的,你可以使用客戶端中的status方法。這個(gè)方法獲得從服務(wù)器發(fā)送的狀態(tài)代碼并顯示出來。
為了測試這一點(diǎn),在App/Http/Controllers/UserController.php文件中用下面的代碼替換之前的宏代碼:
function macro()
{
$response = Http::reqres()->get('/users?page=2');
return $response->status();
}
這里,狀態(tài)代碼200意味著請求成功。
成功解碼響應(yīng)
如何測試JSON APIs
Laravel有幾個(gè)輔助函數(shù)來測試JSON APIs和它們的響應(yīng)。這些輔助函數(shù)包括json, getJson, postJson, putJson, patchJson, deleteJson, 等等。
為了更好地理解測試,為?GET
?用戶的路由創(chuàng)建一個(gè)測試場景。當(dāng)你啟動(dòng)Laravel應(yīng)用程序時(shí), Example Test已經(jīng)被創(chuàng)建。在test/Feature/ExampleTest.php文件中, 用以下內(nèi)容替換現(xiàn)有代碼:
<?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數(shù)據(jù),并檢查狀態(tài)代碼是否為200。
一旦你添加了測試代碼,在你的終端運(yùn)行以下命令來運(yùn)行測試:
./vendor/bin/phpunit
一旦測試完成,你會(huì)看到它運(yùn)行了兩個(gè)測試,都是成功的。
測試JSON APIs
同樣地,你可以檢查不同類型的請求,并利用其他輔助方法進(jìn)行更復(fù)雜的測試。
如何處理事件
Laravel在處理HTTP請求時(shí)提供了三個(gè)事件。
- RequestSending, 這是在請求被發(fā)送之前。
- ResponseReceived, 這是當(dāng)收到一個(gè)響應(yīng)。
- ConnectionFailed, 這是在沒有收到響應(yīng)的時(shí)候。
所有這三個(gè)事件都包括$?request
?屬性,用來檢查?Illuminate\Http\Client\Request
?實(shí)例,而?ResponseReceived
?有一個(gè)額外的?$response property
。這些對于在事件后執(zhí)行行動(dòng)特別有用。例如,你可能想在得到一個(gè)成功的響應(yīng)后發(fā)送電子郵件。
要?jiǎng)?chuàng)建一個(gè)事件和監(jiān)聽器,請瀏覽app/Providers/EventServiceProvider.php文件,用以下代碼替換listen數(shù)組。
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
'Illuminate\Http\Client\Events\ResponseReceived' => [
'App\Listeners\LogResponseReceived',
],
];
然后在你的終端運(yùn)行以下命令:
php artisan event:generate
上述命令將創(chuàng)建app/Listeners/LogResponseReceived.php監(jiān)聽器。用下面的代碼替換該文件的代碼:
<?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)
{
}
}
狀態(tài)代碼的信息日志被輸出到終端。
顯示狀態(tài)代碼的終端日志
小結(jié)
無論一個(gè)網(wǎng)站或網(wǎng)絡(luò)應(yīng)用是由一個(gè)組織或獨(dú)立開發(fā)者制作的,API都是其成功的關(guān)鍵。然而,使用它們可能是困難的。文章來源:http://www.zghlxwxcb.cn/news/detail-811317.html
許多框架和庫都承諾簡化這一過程, 但Laravel因其專注于簡單性和易用性而脫穎而出. 他們內(nèi)置的客戶端支持簡單的API調(diào)用, 并發(fā)的API調(diào)用, API Macros, 基于JSON的API的輔助方法, 以及更多。文章來源地址http://www.zghlxwxcb.cn/news/detail-811317.html
到了這里,關(guān)于如何使用Laravel的HTTP客戶端與外部API交互的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!