Thông thường chúng ta hay call nhiều API trong một lần request từ phía client. Chúng ta có thể sử dụng promise để xử lý nó ở phía client cũng được. Vì promise call multiple API quá là tốt rồi
Nay chia sẻ với các dev , bro cách chúng ta call nhiều API trong Laravel, nói chung là ở phía Backend , chúng ta dùng HTTP Requests , để xử lý vấn đề này
Cú pháp :
$promise = Http::async()->get($url);
//or
$promise = Http::async()->get($url)->then(fn (Response|TransferException $result) => $this->handleResult($result));
Okay, let's go, đi thôi các bro, dưới đây là cách ta sử dụng chúng
use Illuminate\Support\Facades\Http;
use GuzzleHttp\Promise\Utils;
use GuzzleHttp\Exception\ConnectException;
use Illuminate\Http\Client\Pool;
Route::get('multiple-request', function() {
$responses = Utils::all([
'foo' => Http::async()->get('https://jsonplaceholder.typicode.com/todos/1')->then(function ($response) {
// Xử lý phản hồi foo
return $response;
}),
'bar' => Http::async()->get('https://jsonplaceholder.typicode.com/todos/2')->then(function ($response) {
// Xử lý phản hồi bar
return $response;
}),
'baz' => Http::async()->get('https://jsonplaceholder.typicode.com/todos/3')->then(function ($response) {
// Xử lý phản hồi baz
return $response;
}),
])->wait();
// Kiểm tra kết quả của từng yêu cầu
$fooOk = $responses['foo']->ok();
$barSuccessful = $responses['bar']->successful();
$connectionFailed = $responses['baz'] instanceof ConnectException;
return [
'foo' => $responses['foo']->ok() ? $responses['foo']->json() : 'Request to foo failed',
'bar' => $responses['bar']->successful() ? $responses['bar']->json() : 'Request to bar failed',
'baz' => $responses['baz']->ok() ? $responses['baz']->json() : 'Request to baz failed',
];
});
Trên là một cách mà ta có thể gọi không đồng bộ (asynchronous requests ), bạn sẽ được kết quả trả về như sau:
Trong HTTP Requests của Laravel, ta cũng có thể sử dụng Pool để xử lý call API
Route::get('multiple-request-using-pool', function() {
$responses = Http::pool(fn (Pool $pool) => [
$pool->get('https://jsonplaceholder.typicode.com/todos/1'),
$pool->get('https://jsonplaceholder.typicode.com/todos/2'),
$pool->get('https://jsonplaceholder.typicode.com/todos/3'),
]);
$responses[0]->ok();
$responses[1]->successful();
// Kiểm tra và lấy nội dung từ các phản hồi
$data = [
'todo_1' => $responses[0]->ok() ? $responses[0]->json() : 'Request to todo 1 failed',
'todo_2' => $responses[1]->successful() ? $responses[1]->json() : 'Request to todo 2 failed',
'todo_3' => $responses[2]->ok() ? $responses[2]->json() : 'Request to todo 3 failed',
];
return response()->json($data);
});
Kết quả cũng trả về như dưới đây :
Trên là 2 cách mà bạn có thể test thử, đôi lúc ta cũng cần xử lý 1 lần request mà gọi nhiều API