Cara Menggunakan Klien Bawaan Laravel untuk Berinteraksi dengan API Eksternal
Diterbitkan: 2023-04-24Laravel membuat interaksi API mudah bagi pengembang web baru dan berpengalaman. Klien HTTP Larvel dibangun di atas klien HTTP Guzzle PHP untuk memberi pengembang pengalaman yang lebih mulus saat membuat permintaan HTTP. Fitur utamanya meliputi autentikasi, perutean, dan pemetaan objek-relasional (ORM) yang efektif.
Artikel ini akan membahas penggunaan klien HTTP Laravel untuk membuat permintaan, respons debug, membuat middleware dan makro, dan banyak lagi.
Klien HTTP Laravel Melakukan Kerja Keras untuk Anda untuk API
Guzzle adalah klien HTTP sederhana untuk PHP. Ini menawarkan fungsionalitas untuk permintaan formulir yang berbeda, termasuk GET
, POST
, PUT
, dan DELETE
di samping kemampuan streaming dan permintaan multi bagian. Dengan klien HTTP Guzzle, pengiriman permintaan sinkron dan asinkron ke server dimungkinkan. Selain itu, ia juga hadir dengan middleware yang layak untuk menyesuaikan perilaku klien.
Klien HTTP Laravel adalah pembungkus yang dibangun di atas Guzzle tetapi dengan fungsionalitas ekstra. Ini termasuk dukungan untuk mencoba kembali permintaan yang gagal dan beberapa fungsi pembantu dengan data JSON. Sebagian besar fungsionalitas klien HTTP Laravel mirip dengan Guzzle.
Prasyarat
Di bagian berikut, Anda akan mempelajari lebih lanjut tentang klien HTTP Laravel. Untuk mengikuti, Anda perlu:
- Pengetahuan dasar tentang Laravel, PHP, dan API
- PHP dan Komposer diinstal
- Tukang pos
Cara Membuat Permintaan
Untuk memahami cara menggunakan klien HTTP untuk membuat permintaan, Anda dapat memanfaatkan banyak API yang dihosting, seperti ReqRes.
Mulailah dengan mengimpor paket HTTP yang disertakan saat membuat aplikasi. Di dalam file App/Http/Controllers/UserController.php , tambahkan kode berikut, dimulai dengan pernyataan use di awal file dan kode sisanya di dalam fungsi indeks.
use Illuminate\Support\Facades\Http; return Http::get("https://reqres.in/api/users?page=2");
Catatan: Untuk kasus penggunaan yang kompleks, Anda juga dapat mengirim permintaan dengan header menggunakan metode withHeaders
.
Di file yang sama, buat postingan metode baru menggunakan kode di bawah ini:
function post() { $response = Http::withHeaders([ 'Content-Type' => 'application/json', ])->post('https://reqres.in/api/users', [ 'name' => 'morpheus', 'job' => 'leader', ]); return $response; }
Kemudian tambahkan rute untuk itu di dalam file routes/web.php :
Route::get('post',[UserController::class,'post']);
Sekarang, Postman dapat digunakan untuk menguji rute ini. Buka Postman dan tambahkan http://127.0.0.1:8000/post sebagai URL, dengan jenis permintaan sebagai GET
. Setelah mengklik send , Anda akan melihat respons berikut:
Permintaan Bersamaan
Permintaan paralel meningkatkan performa secara signifikan karena Anda dapat mengambil lebih banyak data dalam periode yang sama. Klien HTTP Laravel memungkinkan untuk melakukan permintaan bersamaan menggunakan metode kumpulan.
Di dalam App/Http/Controllers/UserController.php , tambahkan kode berikut:
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(); }
Kemudian, tambahkan rute pendukung di dalam file routes/web.php .
Route::get('concurrent',[UserController::class,'concurrent']);
Browser memberikan respons berikut saat rute dikunjungi:
Permintaan Makro
Makro permintaan berguna saat berinteraksi dengan jalur API umum.
Untuk membuat makro, Anda perlu mendefinisikan makro di dalam metode boot file app/Http/Providers/AppServiceProvider.php menggunakan kode di bawah ini:
use Illuminate\Support\Facades\Http; Http::macro('reqres', function () { return Http::baseUrl('https://reqres.in/api'); });
Catatan: Pastikan untuk menambahkan pernyataan penggunaan di awal file.
Kemudian, gunakan makro di dalam UserController
dengan menambahkan kode berikut:
function macro() { $response = Http::reqres()->get('/users?page=2'); return $response; }
Seperti yang Anda lihat, karena makro sudah dibuat, Anda tidak perlu menambahkan URL lengkap lagi.
Terakhir, tambahkan route di file routes/web.php menggunakan kode di bawah ini:
Route::get('macro',[UserController::class,'macro']);
Cara Mendekode Respons
Untuk mendekode respons dan memastikan permintaan API berhasil, Anda menggunakan metode status yang disertakan dalam klien. Metode ini mendapatkan kode status yang dikirim dari server dan menampilkannya.
Untuk mengujinya, ganti kode makro sebelumnya dengan kode di bawah ini di dalam file App/Http/Controllers/UserController.php :
function macro() { $response = Http::reqres()->get('/users?page=2'); return $response->status(); }
Di sini, kode status 200 berarti permintaan berhasil.
Cara Menguji JSON API
Laravel memiliki beberapa bantuan untuk menguji API JSON dan responsnya. Fungsi pembantu termasuk json , getJson , postJson , putJson , patchJson , deleteJson , dan sebagainya.
Untuk memahami Pengujian dengan lebih baik, buat skenario pengujian untuk rute pengguna GET
. Saat Anda mem-bootstrap aplikasi Laravel, Tes Contoh sudah dibuat. Di dalam file testing/Feature/ExampleTest.php , ganti kode yang ada dengan kode berikut:
<?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); } }
Kode yang ditambahkan mengambil data JSON di rute pengguna dan memeriksa apakah kode statusnya 200 atau tidak.
Setelah Anda menambahkan kode pengujian, jalankan perintah berikut di terminal Anda untuk menjalankan pengujian:
./vendor/bin/phpunit
Setelah tes selesai, Anda akan melihat bahwa itu menjalankan dua tes, yang keduanya berhasil.
Demikian pula, Anda dapat memeriksa berbagai jenis permintaan dan menggunakan metode pembantu lainnya untuk pengujian yang lebih canggih.
Cara Menangani Acara
Laravel menawarkan tiga peristiwa untuk diaktifkan saat menangani permintaan HTTP.
- RequestSending , yaitu sebelum permintaan dikirim.
- ResponseReceived , yaitu saat respons diterima.
- ConnectionFailed , yaitu saat tidak ada respons yang diterima.
Ketiga event menyertakan properti $request
untuk memeriksa instance Illuminate\Http\Client\Request
, dan ResponseReceived
memiliki $response property
tambahan . Ini sangat berguna untuk melakukan tindakan setelah acara. Misalnya, Anda mungkin ingin mengirim email setelah mendapatkan respons yang berhasil.
Untuk membuat event dan listener, arahkan ke file app/Providers/EventServiceProvider.php dan ganti array listen dengan kode berikut.
protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], 'Illuminate\Http\Client\Events\ResponseReceived' => [ 'App\Listeners\LogResponseReceived', ], ];
Kemudian jalankan perintah berikut di terminal Anda:
php artisan event:generate
Perintah di atas akan membuat pendengar app/Listeners/LogResponseReceived.php . Ganti kode file tersebut dengan kode di bawah ini:
<?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) { } }
Log info dari kode status dicetak di terminal.
Ringkasan
Apakah situs web atau aplikasi web dibuat oleh organisasi atau pengembang independen, API adalah kunci keberhasilannya. Namun, menggunakannya bisa jadi sulit.
Banyak kerangka kerja dan perpustakaan berjanji untuk menyederhanakan proses ini, tetapi Laravel menonjol karena fokusnya pada kesederhanaan dan kemudahan penggunaan. Klien bawaan mereka mendukung panggilan API yang mudah, panggilan API bersamaan, API Macro, metode pembantu untuk API berbasis JSON, dan banyak lagi.