Setiap percakapan dengan API eksternal pada dasarnya tersusun dari empat hal: kata kerja HTTP (GET, POST, PUT, DELETE), query string, header, dan body. Chapter ini membedah cara facade Http menangani keempatnya dengan pola yang konsisten: method request menerima URL beserta datanya, sementara opsi tambahan dirantai sebelum method terakhir. Untuk membuktikan bentuk request yang benar-benar terkirim — bukan sekadar teori — setiap contoh memakai fake yang memantulkan request kembali sebagai response, lalu mencetak hasilnya. Dengan begitu kita bisa melihat URL final, body, dan Content-Type persis seperti yang diterima server tujuan, dan kebiasaan ini pula yang akan kita pakai untuk memverifikasi request saat testing nanti.
GET dengan Query String #
Method get() menerima array asosiatif sebagai parameter keduanya; HTTP Client mengubahnya menjadi query string secara otomatis:
<?php
use Illuminate\Support\Facades\Http;
// Fake memantulkan struktur request kembali ke kita
Http::fake(fn ($request) => Http::response([
'url' => $request->url(),
'method' => $request->method(),
'headers' => $request->headers(),
'body' => $request->body(),
]));
$response = Http::get('https://api.example.com/tasks', [
'status' => 'selesai',
'halaman' => 2,
]);
echo 'GET '.$response->json('url')."\n";Output yang Dihasilkan:
GET https://api.example.com/tasks?status=selesai&halaman=2Alternatif yang lebih baru adalah withQueryParameters(). Method ini memisahkan URL dari parameternya sehingga berguna saat URL panjang atau parameternya dibangun bertahap:
<?php
$response = Http::withQueryParameters(['status' => 'selesai'])
->get('https://api.example.com/tasks');
echo 'GET '.$response->json('url')."\n";Output yang Dihasilkan:
GET https://api.example.com/tasks?status=selesaiPOST dengan Body JSON #
Body request dibangun lewat array parameter kedua pada method post(), put(), patch(), dan delete(). Secara default HTTP Client mengirimnya sebagai JSON — inilah mengapa API berbasis JSON tinggal dipakai tanpa konfigurasi:
<?php
$response = Http::post('https://api.example.com/tasks', [
'judul' => 'Belajar HTTP Client',
'prioritas' => 'tinggi',
]);
echo 'body: '.$response->json('body')."\n";
echo 'content-type: '.$response->json('headers.Content-Type.0')."\n";Output yang Dihasilkan:
body: {"judul":"Belajar HTTP Client","prioritas":"tinggi"}
content-type: application/jsonOutput tersebut berasal dari pantulan fake: body terkirim sebagai JSON, dan header Content-Type otomatis diisi application/json tanpa kita menulisnya. Perilaku default ini mengikuti kenyataan bahwa mayoritas API modern bertutur dalam JSON. Method post(), put(), dan patch() menerima array yang sama persis — perbedaannya hanya kata kerja yang dipakai kirim.
Form, Multipart, dan Raw Body #
Tidak semua server menerima JSON. Method berikut mengubah format body sebelum dikirim — cukup dipanggil sebelum method request:
| Method chain | Format body | Content-Type |
|---|---|---|
| (default) | JSON | application/json |
asForm() | form-encoded | application/x-www-form-urlencoded |
asMultipart() | multipart | multipart/form-data |
withBody($isi, $tipe) | raw string | sesuai parameter kedua |
Contoh asForm() untuk API lama yang masih menuntut form klasik:
<?php
$response = Http::asForm()->post('https://api.example.com/tasks', [
'judul' => 'Belajar HTTP Client',
'prioritas' => 'tinggi',
]);
echo 'body: '.$response->json('body')."\n";
echo 'content-type: '.$response->json('headers.Content-Type.0')."\n";Output yang Dihasilkan:
body: judul=Belajar+HTTP+Client&prioritas=tinggi
content-type: application/x-www-form-urlencodedSementara asMultipart() dipakai untuk upload berkas. Setiap field dikirim sebagai array berisi name, contents, dan untuk berkas ditambah filename:
<?php
// Siapkan berkas contoh
file_put_contents('/tmp/lampiran.txt', 'Isi lampiran tugas.');
$response = Http::asMultipart()->post('https://api.example.com/tugas/1/lampiran', [
['name' => 'catatan', 'contents' => 'Lampiran pertama'],
['name' => 'berkas', 'contents' => fopen('/tmp/lampiran.txt', 'r'), 'filename' => 'lampiran.txt'],
]);
echo 'content-type: '.$response->json('headers.Content-Type.0')."\n";
echo 'body: '.$response->json('body')."\n";Output yang Dihasilkan:
content-type: multipart/form-data; boundary=ee27eaa685864ae...
body: --ee27eaa685864ae...
Content-Disposition: form-data; name="catatan"
Lampiran pertama
--ee27eaa685864ae...
Content-Disposition: form-data; name="berkas"; filename="lampiran.txt"
Content-Type: text/plain
Isi lampiran tugas.
--ee27eaa685864ae...--Pilihan format mengikuti selera server tujuan, bukan selera kita. API berbasis JSON modern cukup memakai default; form-encoded untuk gateway pembayaran lawas atau API yang dibangun di atas $_POST PHP klasik; multipart satu-satunya pilihan untuk upload berkas karena form-encoded tidak bisa membawa metadata nama file. Setiap method format ini hanya berlaku untuk satu request — panggilan Http:: berikutnya kembali ke default JSON.
Terakhir, withBody() mengirim string mentah apa adanya — berguna untuk API yang memakai XML atau payload JSON yang sudah jadi. Parameter keduanya mengatur Content-Type:
<?php
$response = Http::withBody(json_encode(['judul' => 'Raw body']), 'application/json')
->post('https://api.example.com/tasks');
echo 'body: '.$response->json('body')."\n";Output yang Dihasilkan:
body: {"judul":"Raw body"}Method withBody() mengirim string yang kita berikan bit per bit tanpa diproses lagi — kitalah yang bertanggung jawab meng-encode datanya, jadi kesalahan json_encode menjadi kesalahan kita sendiri.
PUT, PATCH, dan DELETE #
Method untuk kata kerja lain mengikuti pola yang sama persis. put() mengganti seluruh resource, patch() memperbarui sebagian field, dan delete() cukup diberi URL — semuanya tetap bisa menerima body bila API menuntutnya:
<?php
$response = Http::put('https://api.example.com/tasks/1', ['judul' => 'Judul baru']);
echo $response->json('method').' '.$response->json('url')."\n";
$response = Http::patch('https://api.example.com/tasks/1', ['prioritas' => 'rendah']);
echo $response->json('method').' '.$response->json('url')."\n";
$response = Http::delete('https://api.example.com/tasks/1');
echo $response->json('method').' '.$response->json('url')."\n";Output yang Dihasilkan:
PUT https://api.example.com/tasks/1
PATCH https://api.example.com/tasks/1
DELETE https://api.example.com/tasks/1Header kustom tinggal dirantai lewat withHeaders() — kita akan pakai teknik yang sama untuk token autentikasi di chapter berikutnya. Daftar lengkap semua method request tersedia di dokumentasi HTTP Client
.
Request kita kini bisa membawa apa pun yang diminta server tujuan. Yang belum dibahas adalah identitas: bearer token, basic auth, dan header kustom yang membuktikan siapa pemanggilnya — lanjut ke chapter Authentication dan Headers .