Sejauh ini aplikasi Laravel kita berperan sebagai server: menerima request dari browser lalu mengembalikan response. Aplikasi modern juga sering berada di sisi sebaliknya — sebagai client yang memanggil API pihak ketiga: mengambil kurs mata uang, mengirim pesan WhatsApp, memverifikasi pembayaran ke payment gateway, atau menyinkronkan data ke layanan eksternal. Menulis panggilan HTTP mentah dengan cURL atau Guzzle tentu bisa, tetapi kodenya bertele-tele dan sulit diuji. Laravel membungkus semua itu dalam HTTP Client
: API ekspresif berbasis facade Http untuk mengirim request keluar, membaca response, sampai meniru jaringan saat testing.
HTTP Client adalah Guzzle dalam Bungkus Ekspresif #
Secara teknis, HTTP Client Laravel adalah lapisan tipis di atas Guzzle — HTTP client paling populer di ekosistem PHP. Facade Http meneruskan setiap panggilan ke GuzzleHttp\Client di balik layar, lalu membungkus hasilnya menjadi object Illuminate\Http\Client\Response yang nyaman dipakai. Perhatikan dua penulisan yang setara berikut:
<?php
// Guzzle mentah — valid, tetapi bertele-tele
$guzzle = new GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
$hasilGuzzle = $guzzle->get('/proyek');
$namaGuzzle = json_decode((string) $hasilGuzzle->getBody(), true)['nama'];
// Laravel HTTP Client — ringkas dan ekspresif
use Illuminate\Support\Facades\Http;
$response = Http::get('https://api.example.com/proyek');
$nama = $response->json('nama');Karena sudah menjadi bagian framework, kita tidak perlu menginstal apa pun — composer create-project sudah membawa semua dependensinya. Tidak ada composer require guzzlehttp/guzzle tersendiri, tidak ada konfigurasi tambahan. Facade Http langsung tersedia di controller, command, queue job, bahkan file route.
Permintaan GET Pertama Kita #
Mari kirim request pertama. Untuk contoh yang deterministik, kita gunakan Http::fake() — fitur yang meniru response jaringan sehingga contoh berjalan tanpa koneksi internet dan hasilnya selalu sama. Pembahasan lengkap fake() menanti di chapter Mocking HTTP Requests
; sekarang cukup anggap response berikut berasal dari server sungguhan:
<?php
use Illuminate\Support\Facades\Http;
Http::fake([
'api.example.com/proyek' => Http::response([
'id' => 1,
'nama' => 'Belajar Laravel',
'status' => 'aktif',
], 200),
]);
$response = Http::get('https://api.example.com/proyek');
echo 'status: '.$response->status()."\n";
echo 'ok: '.var_export($response->successful(), true)."\n";
echo 'body: '.$response->body()."\n";
echo 'nama: '.$response->json('nama')."\n";Output yang Dihasilkan:
status: 200
ok: true
body: {"id":1,"nama":"Belajar Laravel","status":"aktif"}
nama: Belajar LaravelEmpat baris terakhir memperlihatkan cara kerja object Response: status() mengembalikan kode HTTP sebagai integer, successful() mengevaluasi true untuk status 2xx, body() mengembalikan isi response sebagai string mentah, dan json() mem-parse body JSON sekaligus mengambil satu key. Satu baris Http::get() menangani koneksi, pengiriman, dan pembacaan response — tanpa satu pun curl_setopt.
Sinkron versus Concurrency #
Panggilan Http::get() bersifat sinkron: baris berikutnya menunggu response datang. Untuk satu-dua request hal itu wajar, tetapi bayangkan mengambil data tiga layanan sekaligus — dijalankan bergantian, total waktunya adalah jumlah ketiga durasi. HTTP Client menyediakan Http::pool() untuk menjalankan request secara concurrent memakai promise Guzzle:
<?php
use Illuminate\Http\Client\Pool;
use Illuminate\Support\Facades\Http;
Http::fake([
'api.example.com/proyek/1' => Http::response(['id' => 1, 'nama' => 'Belajar Laravel']),
'api.example.com/proyek/2' => Http::response(['id' => 2, 'nama' => 'Belajar HTTP Client']),
]);
[$satu, $dua] = Http::pool(fn (Pool $pool) => [
$pool->get('https://api.example.com/proyek/1'),
$pool->get('https://api.example.com/proyek/2'),
]);
echo 'pool: '.$satu->json('nama').' & '.$dua->json('nama')."\n";Output yang Dihasilkan:
pool: Belajar Laravel & Belajar HTTP ClientKedua request terbang hampir bersamaan, lalu pool() mengembalikan array response dalam urutan yang sama seperti pengirimannya. Detail concurrency penuh — termasuk memberi nama pada request agar mudah diambil — dibahas di dokumentasi concurrency
dan section performa; di section ini fokus kita adalah pola pemanggilan API sehari-hari.
Kita sudah memegang gambaran besarnya: facade Http mengirim, object Response menjawab. Langkah berikutnya adalah menguasai kata kerja HTTP itu sendiri — GET dengan query string, POST dengan body JSON, form, sampai upload file — yang kita bahas tuntas di chapter Mengirim HTTP Request
.