Berpindah dari membaca menjadi menulis: mengirim data dengan POST, mengatur method PUT, PATCH, dan DELETE, meng-encode otomatis nilai form, serta mengunggah file melalui multipart form data.

Hingga episode 4, kalian terutama membaca: mengambil halaman, melihat header, mengikuti redirect. Sekarang saatnya sisi yang lebih menarik — menulis: mengirim data ke server dengan POST, mengganti resource dengan PUT, menghapus dengan DELETE, dan mengunggah file. Inilah gerbang menuju pengujian API sungguhan.
Mengapa episode ini penting? Karena di dunia nyata, jarang sekali kalian hanya melakukan GET. Membuat pengguna baru, mengirim pesan, mengunggah laporan, menghapus data — semuanya adalah request yang membawa payload. Kalian tidak bisa mengandalkan browser Developer Tools selamanya; dengan curl, setiap request bisa diulang, di-script, dan dianalisis dengan tepat.
Dari episode 0, kita sudah mengenal method HTTP. Sekarang lihat bagaimana curl memetakannya:
| Method | Fungsi | Curl |
|---|---|---|
| GET | Membaca data | Default tanpa opsi data |
| POST | Membuat resource baru | -X POST -d "..." |
| PUT | Mengganti resource utuh | -X PUT -d "..." |
| PATCH | Mengubah sebagian | -X PATCH -d "..." |
| DELETE | Menghapus resource | -X DELETE |
Satu fakta penting yang akan menyelamatkan kalian dari kebingungan: opsi -d sudah otomatis mengubah method menjadi POST. Artinya curl -d "a=1" URL dan curl -X POST -d "a=1" URL menghasilkan hal yang sama. Menulis -X POST secara eksplisit lebih untuk kejelasan — praktik yang banyak disukai.
-d: Form-URL-EncodedBentuk paling dasar mengirim data adalah dengan -d (--data). Data dikirim sebagai application/x-www-form-urlencoded — format yang sama dengan form HTML biasa: pasangan nama=nilai dipisahkan tanda &.
curl -X POST -d "name=Arman&role=devops" https://httpbin.org/postMari kita bedah: -d "name=Arman&role=devops" mendefinisikan dua pasang field. Curl mengirimnya sebagai body dengan Content-Type: application/x-www-form-urlencoded. Sebagai latihan, jalankan dan perhatikan di output: httpbin.org/post akan mengembalikan JSON berisi form dengan field name dan role — bukti bahwa data sampai dengan benar.
Tip
Ketik -d "name=Arman&role=devops" persis seperti contoh, lalu perhatikan bahwa spasi dan karakter khusus di dalam nilai harus di-encode manual. Kalau malas menghitung encode manual, jangan khawatir — solusinya ada di bagian berikutnya.
--data-urlencode: Biar Curl yang Meng-encodeMasalahnya muncul saat nilai mengandung spasi, tanda &, atau karakter khusus — misalnya nama "Arman Dwi Pangestu". Jika ditulis mentah di -d, data akan salah diurai oleh server.
Solusinya: opsi --data-urlencode yang otomatis meng-encode nilai sesuai aturan URL:
curl -X POST \
--data-urlencode "name=Arman Dwi Pangestu" \
--data-urlencode "notes=suka 100% dengan curl" \
https://httpbin.org/postPerhatikan: spasi akan dikirim sebagai %20, tanda % sebagai %25, dan seterusnya. Server akan menerima data yang utuh dan benar. Aturan praktisnya: selalu pakai --data-urlencode untuk nilai yang berasal dari input manusia — nama, pesan, parameter query — dan -d untuk data yang memang sudah aman.
Setelah POST, tiga method lain melengkapi operasi CRUD. Polanya sama — tentukan method dengan -X, kirim data dengan -d jika diperlukan:
curl -X PUT -d "title=Episod Kelima&content=lorem" https://httpbin.org/putcurl -X DELETE https://httpbin.org/deletecurl -X PATCH -d "title=Judul Diperbarui" https://httpbin.org/patchSemantiknya: PUT mengganti resource utuh, PATCH hanya bagian yang dikirim, DELETE menghapus. Banyak API mengikuti semantik ini dengan ketat, jadi biasakan memilih method yang tepat sejak awal — bukan sekadar -X POST untuk segala hal.
-FKetika data yang dikirim berupa file — atau kombinasi field dan file, seperti formulir pendaftaran dengan foto — format application/x-www-form-urlencoded tidak lagi memadai. Di sinilah multipart form data (multipart/form-data) masuk: format yang sama dengan yang digunakan browser saat <form> mengunggah file.
Opsi curl untuk ini adalah -F (--form). Formatnya mirip -d, dengan satu perbedaan besar: nilai dengan awalan @ berarti isi dari sebuah file.
curl -X POST \
-F "name=Arman" \
-F "avatar=@/tmp/foto.jpg" \
https://httpbin.org/postDi contoh di atas, -F "name=Arman" mengirim field teks biasa, sedangkan -F "avatar=@/tmp/foto.jpg" mengirim isi file /tmp/foto.jpg sebagai file bernama foto.jpg. Server akan menerima keduanya dalam satu body multipart — lihat di output httpbin.org/post: bagian form berisi name, dan bagian files berisi avatar.
Important
Arah @ menentukan perilaku: -F "file=@path" mengirim isi file dari path, sedangkan -F "file=path" mengirim string path apa adanya sebagai nilai field. Awalan @ ini juga dipakai -d dan -T — ia adalah simbol "baca dari file" di dunia curl. Untuk mengubah nama file yang dikirim, gunakan ;filename= seperti -F "avatar=@/tmp/foto.jpg;filename=profil.jpg".
-d vs -F: Kapan Pakai yang Mana?| Kebutuhan | Pakai | Content-Type |
|---|---|---|
| Field teks sederhana | -d | application/x-www-form-urlencoded |
| Nilai yang butuh encode otomatis | --data-urlencode | Sama dengan -d |
| Upload file / campuran field + file | -F | multipart/form-data |
Analoginya: -d itu seperti mengisi formulir dengan pulpen — cepat untuk data pendek. -F itu seperti mengirim paket dengan lampiran — dibutuhkan saat ada file. Keduanya sah, tinggal sesuaikan dengan kebutuhan server.
Menggabungkan -d dan -F dalam satu request. Keduanya mengatur Content-Type secara berbeda dan saling bertabrakan. Pilih salah satu — jangan campur.
Lupa @ saat ingin mengunggah file. -F "file=path" mengirim teks path, bukan isi file. Awalan @ adalah pembeda utamanya.
Menulis -X DELETE tanpa memahami server. Sebagian framework dan server lama mengharuskan method POST dengan field _method=delete. Selalu baca dokumentasi API yang kalian targetkan.
Berharap -d otomatis mengirim JSON. -d mengirim form-url-encoded. Untuk JSON, kalian perlu mengatur header Content-Type: application/json — topik yang akan kita bahas di episode 6.
Note
Bila kalian ingin mengirim data dari file sebagai body, curl juga mendukung -d @file — awalan @ berarti "baca dari file ini". Ini sangat berguna saat body request disimpan sebagai file template, misalnya -d @payload.json. Pola ini akan kembali muncul di episode JSON & REST API testing.
Pada episode 5 ini kalian telah berpindah dari sekadar membaca menjadi menulis: mengirim data form dengan -d, memastikan nilai aman dengan --data-urlencode, memilih method PUT/PATCH/DELETE dengan -X, serta mengunggah file dengan multipart -F.
Inti yang harus dibawa pulang:
-d otomatis menjadikan request sebagai POST; -X memilih method secara eksplisit.--data-urlencode menangani encode nilai — wajib untuk input manusia.-F = multipart untuk upload file; @ berarti "isi dari file".-d dan -F dalam satu request.Di episode 6 selanjutnya kita akan menggabungkan semuanya untuk JSON & REST API testing — mengirim body JSON dengan header Content-Type: application/json, membaca respons JSON dengan jq, serta membangun alur CRUD lengkap terhadap sebuah API. Sampai jumpa di episode 6!