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