Mengendalikan percakapan HTTP dengan lebih presisi: mengirim dan menimpa header request, membaca serta menyimpan header respons, mengikuti redirect dengan aman, dan mengelola cookie antar request.

Setelah di episode 3 kalian menjalankan request HTTP pertama dan bisa membaca verbose output, sekarang saatnya mengambil kendali penuh atas percakapan HTTP. Di episode ini kita akan belajar mengirim header yang kita tentukan sendiri, membaca dan menyimpan header respons, menangani redirect, serta mengelola cookie.
Jika episode 3 adalah "belajar mendengar", episode 4 adalah "belajar menyampaikan permintaan dengan presisi". Server membaca identitas dan niat kalian dari header — dengan mengendalikannya, kalian bisa menyamar sebagai browser, meminta format JSON, mengirim token otentikasi, dan menjaga sesi melewati redirect. Ini keterampilan yang akan kalian pakai setiap hari saat menguji API.
-HHeader request biasanya diatur oleh curl secara default, tapi hampir selalu ada kalanya kalian perlu menambahkan header sendiri — misalnya meminta format JSON, atau mengirim token API. Opsi -H (atau --header) memungkinkan hal itu:
curl -H "Accept: application/json" https://api.example.com/dataFormatnya selalu "Nama-Header: Nilai". Untuk mengirim beberapa header sekaligus, cukup ulang opsi -H — satu -H untuk satu header:
curl -H "Accept: application/json" \
-H "X-Api-Key: rahasia123" \
-H "User-Agent: belajar-curl/1.0" https://api.example.com/dataDua hal penting tentang -H:
User-Agent ditimpa dari curl/8.21.0 menjadi belajar-curl/1.0.-H "Nama-Header:" (nilai kosong). Ini trik yang sering dipakai untuk menyingkirkan header bawaan yang tidak diinginkan.Tip
Untuk melihat header yang sampai di server, gunakan endpoint echo seperti httpbin.org/headers. Server tersebut akan mengembalikan JSON berisi semua header yang diterimanya — cara tercepat untuk memastikan header kalian benar-benar terkirim sesuai keinginan. Contoh: curl -H "Accept: application/json"{:bash} https://httpbin.org/headers.
-i, -D, dan -IKita sudah tahu -I (HEAD) dari episode 3. Sekarang tiga cara lain untuk melihat header respons:
| Opsi | Perilaku |
|---|---|
-i (--include) | Menampilkan header respons diikuti body pada output yang sama |
-D file (--dump-header) | Menyimpan header respons ke file terpisah |
-D - | Menyimpan header ke stdout (dipisah dari body) |
-I (--head) | Mengirim method HEAD — hanya header, tanpa body |
Contoh -i — header dan body tampil bersamaan:
curl -i https://example.comDan -D — header ditulis ke file sementara body tetap ke stdout:
curl -D headers.txt https://example.comPerbedaan kuncinya: -i mencampur header dengan body di satu aliran, sedangkan -D memisahkannya — body tetap bisa dialirkan ke proses lain tanpa terkontaminasi. Untuk menguji API, kombinasi -D - dan pemipaan body ke jq adalah pola yang sangat umum.
-L dan --max-redirsSering kali halaman yang kalian minta tidak benar-benar berada di URL tersebut — server mengirim respons 3xx beserta header Location yang menunjukkan alamat baru. Ini seperti seseorang pindah rumah dan meninggalkan alamat penerusannya.
Sekarang, bagian yang sering mengejutkan pemula: secara default, curl TIDAK mengikuti redirect. Ia hanya menampilkan respons 3xx-nya dan berhenti. Coba sendiri:
curl -i http://example.comKalian akan melihat baris HTTP/1.1 301 Moved Permanently dan header Location: https://example.com/, lalu curl berhenti — halaman final tidak pernah diambil. Untuk menyuruh curl mengejar redirect, gunakan -L (--location):
curl -L http://example.comSekarang curl secara otomatis mengirim request baru ke URL di header Location, dan melakukannya berulang jika ada redirect berantai. Untuk membatasi jumlah lompatan — melindungi diri dari redirect loop — gunakan --max-redirs:
curl -L --max-redirs 5 https://api.example.comWarning
Saat mengikuti redirect, curl bisa mengubah method POST menjadi GET untuk respons 301, 302, dan 303 — sesuai perilaku standar HTTP. Jika API kalian mengandalkan method tertentu saat redirect, perhatikan opsi --post301, --post302, dan --post303 yang memaksa method tetap dipertahankan.
-b dan -cHTTP pada dasarnya tidak bernegara (stateless) — setiap request berdiri sendiri. Cookie adalah mekanisme untuk mengingat: server mengirim cookie di respons, dan klien mengirimkannya kembali pada request berikutnya. Tanpa cookie, fitur "login" tidak akan berfungsi.
Curl tidak menyimpan cookie secara otomatis. Dua opsi yang mengaturnya:
-c file (--cookie-jar) — menyimpan cookie yang diterima ke sebuah file.-b file (--cookie) — mengirim cookie dari file bersama request.Alurnya seperti proses login lalu lanjut bekerja:
curl -c cookies.txt -d "user=armand&pass=1234" https://app.example.com/logincurl -b cookies.txt https://app.example.com/dashboardPola -c lalu -b dengan file yang sama adalah idiom paling umum untuk menjaga sesi antar request. Kalian juga bisa menulis cookie langsung sebagai string, misalnya -b "session=abc123" — berguna saat nilai cookie sudah diketahui.
Note
Nama -b dan -c sering tertukar karena singkat dan berurutan di alfabet. Trik mengingat: -c untuk save Cookies (menyimpan ke file) dan -b untuk Bring cookies back (mengirim dari file). Curl -c collects, curl -b brings.
Lupa -L saat menghadapi redirect. Halaman tampak "tidak sampai" padahal hanya 3xx. Selalu cek dengan -i apakah respons yang datang adalah 3xx + Location.
Menulis format header dengan salah. Formatnya selalu "Nama: Nilai" dengan titik dua dan spasi — bukan "Nama = Nilai". Server akan menolak atau mengabaikan header yang salah format.
Mengira -i dan -I sama. -i menampilkan header diikuti body (tetap GET), -I mengirim method HEAD (tanpa body). Konteksnya berbeda.
Melupakan --max-redirs. Redirect berantai yang tidak terkendali bisa berujung pada loop tak berujung. Selalu pasang batas saat menulis script.
Pada episode 4 ini kalian telah mengambil kendali atas percakapan HTTP: mengirim dan menimpa header request dengan -H, membaca serta menyimpan header respons dengan -i dan -D, mengikuti redirect dengan -L dan --max-redirs, serta mengelola cookie dengan -b dan -c.
Inti yang harus dibawa pulang:
-H "Nama: Nilai" menambah atau menimpa header; -H "Nama:" menghapusnya.-i menggabungkan header + body; -D memisahkannya ke file; -I hanya HEAD.-L; batasi lompatan dengan --max-redirs.-c menyimpan, -b mengirim.Di episode 5 selanjutnya kita akan masuk ke metode yang mengubah data di server: POST, PUT, DELETE & Form Data — mengirim payload dengan -d dan --data-urlencode, memilih method dengan -X, serta mengunggah file dengan multipart -F. Sampai jumpa di episode 5!