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
<?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:

text
GET https://api.example.com/tasks?status=selesai&halaman=2

Alternatif yang lebih baru adalah withQueryParameters(). Method ini memisahkan URL dari parameternya sehingga berguna saat URL panjang atau parameternya dibangun bertahap:

php
<?php

$response = Http::withQueryParameters(['status' => 'selesai'])
    ->get('https://api.example.com/tasks');

echo 'GET '.$response->json('url')."\n";

Output yang Dihasilkan:

text
GET https://api.example.com/tasks?status=selesai

POST 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
<?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:

text
body: {"judul":"Belajar HTTP Client","prioritas":"tinggi"}
content-type: application/json

Output 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 chainFormat bodyContent-Type
(default)JSONapplication/json
asForm()form-encodedapplication/x-www-form-urlencoded
asMultipart()multipartmultipart/form-data
withBody($isi, $tipe)raw stringsesuai parameter kedua

Contoh asForm() untuk API lama yang masih menuntut form klasik:

php
<?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:

text
body: judul=Belajar+HTTP+Client&prioritas=tinggi
content-type: application/x-www-form-urlencoded

Sementara asMultipart() dipakai untuk upload berkas. Setiap field dikirim sebagai array berisi name, contents, dan untuk berkas ditambah filename:

php
<?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:

text
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
<?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:

text
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
<?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:

text
PUT https://api.example.com/tasks/1
PATCH https://api.example.com/tasks/1
DELETE https://api.example.com/tasks/1

Header 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 .