Mengirim request dengan curl dan Postman

Dua alat yang akan Anda pakai setiap hari, dan kapan memilih masing-masing.

Sejauh ini Anda mengirim request dari browser dan dari tombol Kirim di halaman-halaman ini. Itu cukup untuk request GET sederhana dan tidak lebih. Untuk memilih method, mengatur header, atau mengirim body, Anda butuh klien sungguhan. Hampir semua penguji akhirnya memakai dua: curl di baris perintah, dan klien grafis seperti Postman. Pelajaran ini membahas keduanya secukupnya agar Anda bisa mengikuti sisa tutorial.

curl

curl adalah program baris perintah yang mengirim request dan mencetak response-nya. Ia terpasang secara bawaan di macOS, sebagian besar sistem Linux, dan Windows 10 serta 11. Periksa dengan curl --version. Ini juga format yang dipakai developer untuk berbagi request: dokumentasi API, alat developer browser, dan Postman semuanya bisa menampilkan atau mengekspor request sebagai perintah curl, jadi Anda perlu bisa membacanya meskipun lebih suka alat lain.

Tanpa opsi, curl hanya mencetak body. Tambahkan -i untuk menyertakan baris status dan header response, yang hampir selalu Anda butuhkan saat menguji:

Terminal
curl -i https://api.testingapis.com/api/health
Output
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
date: Sun, 11 Oct 2026 11:47:45 GMT
server: Kestrel
x-powered-by: TestingAPIs
transfer-encoding: chunked

{"status":"healthy","uptimeSeconds":76890,"timestamp":"2026-10-11T11:47:46Z"}

Untuk detail lebih, -v (verbose) juga mencetak request yang dikirim curl, ditandai >, dan header response, ditandai <. Baris yang diawali * menjelaskan koneksinya. Pakai ini saat request tidak berperilaku seperti yang Anda harapkan dan Anda ingin melihat persis apa yang lewat di jaringan.

Terminal
curl -v https://api.testingapis.com/api/health
Output (dipangkas)
* Host api.testingapis.com:443 was resolved.
* IPv4: 135.13.233.203
* Established connection to api.testingapis.com (135.13.233.203 port 443)
* using HTTP/1.x
> GET /api/health HTTP/1.1
> Host: api.testingapis.com
> User-Agent: curl/8.18.0
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< content-type: application/json; charset=utf-8
< date: Sun, 11 Oct 2026 11:49:47 GMT
< transfer-encoding: chunked
...

curl menambahkan tiga header yang tidak Anda minta: Host, User-Agent, dan Accept. Setiap klien menambahkan beberapa header bawaan, dan tiap klien menambahkan yang berbeda. Saat request yang sama berhasil di Postman dan gagal di curl, header bawaan sering kali penyebabnya.

Method, header, dan body

Tiga opsi mencakup sebagian besar request. -X mengatur method. -H menambahkan header dan bisa diulang. -d mengirim body. Perintah ini mengirim POST dengan body JSON ke endpoint yang membalas dengan apa yang diterimanya:

Terminal
curl -X POST https://api.testingapis.com/api/methods/post \
  -H "Content-Type: application/json" \
  -d '{"name":"Asha","role":"tester"}'
Output
{"method":"POST","message":"POST request received","path":"/api/methods/post","query":{},"contentType":"application/json","bodyLength":31,"bodyTruncated":false,"body":"{\"name\":\"Asha\",\"role\":\"tester\"}","timestamp":"2026-09-30T18:31:16Z"}

Garis miring terbalik di akhir setiap baris membuat perintah berlanjut ke baris berikutnya di bash dan zsh. Body dibungkus tanda kutip tunggal agar shell tidak mengusik tanda kutip ganda di dalamnya. Jika Anda lupa header Content-Type, curl mengirim application/x-www-form-urlencoded, karena -d dirancang untuk formulir HTML, dan banyak API akan menolak body-nya.

curl 7.82 dan yang lebih baru punya jalan pintas, --json, yang mengirim body, mengatur Content-Type: application/json dan Accept: application/json, serta mengganti method menjadi POST. Perintah ini membuat todo sungguhan:

Terminal
curl --json '{"title":"Learn curl","completed":false,"userId":1}' \
  https://api.testingapis.com/api/Todos
Output
{"message":"Todo created successfully","data":{"id":31,"userId":1,"title":"Learn curl","completed":false,"priority":"medium","dueDate":""}}

ID yang Anda dapat akan berbeda, karena orang lain juga membuat todo. Untuk PUT atau PATCH, tambahkan -X PUT atau -X PATCH di samping --json.

Pengukuran waktu dan skrip

-w mencetak nilai yang diukur curl, setelah response. Digabung dengan -s (diam, tanpa bilah progres) dan -o /dev/null (buang body-nya), Anda mendapat ringkasan satu baris:

Terminal
curl -s -o /dev/null \
  -w "status %{http_code}  total %{time_total}s  size %{size_download} bytes\n" \
  https://api.testingapis.com/api/Products
Output
status 200  total 0.382512s  size 5846 bytes

Di Windows, gunakan -o NUL alih-alih -o /dev/null. time_total mencakup pencarian DNS, koneksi, dan TLS, jadi request pertama sering lebih lambat daripada yang berikutnya. Pelajaran performa menguraikan angka ini lebih jauh.

curl di Windows

Windows butuh bagian tersendiri, karena perintah yang sama bisa berperilaku dengan tiga cara tergantung shell-nya.

Di Windows PowerShell 5.1 (versi bawaan Windows), curl bukanlah curl. Itu alias untuk Invoke-WebRequest, perintah PowerShell dengan opsi yang berbeda, sehingga curl -i gagal dengan error yang membingungkan. Ketik curl.exe untuk menjalankan program yang sebenarnya. PowerShell 7 menghapus alias itu, tetapi mengetik curl.exe berfungsi di keduanya, jadi ini kebiasaan yang baik.

Tanda kutip adalah masalah kedua. Windows PowerShell 5.1 menghapus tanda kutip ganda di dalam argumen saat meneruskannya ke program seperti curl.exe. Perintah di bawah terlihat benar, tetapi server menerima JSON yang rusak:

PowerShell 5.1
PS> curl.exe -s -X POST https://api.testingapis.com/api/methods/post -H "Content-Type: application/json" -d '{"name":"Asha"}'
{"method":"POST", ... "bodyLength":11, ... "body":"{name:Asha}", ...}

Body-nya tiba sebagai {name:Asha}, yang bukan JSON. PowerShell 7.3 dan yang lebih baru meneruskan tanda kutip dengan benar. Di versi lama, perbaikan yang paling tidak merepotkan adalah menaruh body di file dan mengarahkan curl ke file itu dengan @. Tanda kutip di sekitar "@body.json" mencegah PowerShell memperlakukan @ sebagai sintaksnya sendiri.

PowerShell
# body.json contains {"name":"Asha","role":"tester"}
curl.exe -s --json "@body.json" https://api.testingapis.com/api/methods/post

Di Command Prompt lama (cmd.exe), tanda kutip tunggal tidak berarti apa-apa, jadi bungkus body dengan tanda kutip ganda dan escape tanda kutip di dalamnya dengan garis miring terbalik. Karakter penyambung baris adalah ^, bukan garis miring terbalik:

Command Prompt
curl -X POST https://api.testingapis.com/api/methods/post ^
  -H "Content-Type: application/json" ^
  -d "{\"name\":\"Asha\",\"role\":\"tester\"}"

Postman dan klien grafis lainnya

Klien grafis melakukan pekerjaan yang sama dengan curl memakai formulir alih-alih perintah: pilih method dari dropdown, ketik URL, isi header dan body di tab, klik Send. Response muncul di bawahnya, terformat, beserta status, waktu, dan ukurannya. Postman yang paling banyak dipakai. Insomnia dan Bruno bekerja dengan cara yang sama, dan Bruno menyimpan semuanya sebagai file biasa, yang disukai sebagian tim karena request-nya bisa berada di repositori Git yang sama dengan kodenya. Ide di bawah berlaku untuk semuanya, dengan nama-nama dari Postman.

Koleksi

Koleksi adalah kumpulan request yang disimpan, biasanya satu per API, dengan folder di dalamnya. Inilah alasan memilih klien grafis alih-alih curl untuk proyek yang Anda kerjakan berbulan-bulan. Anda menyusun request sekali dan membagikan koleksinya ke tim.

Anda tidak perlu menyusunnya secara manual. API ini menerbitkan dokumen OpenAPI, deskripsi yang bisa dibaca mesin untuk setiap endpoint, di https://api.testingapis.com/openapi/v1.jsonmasuk untuk melihat. Di Postman, pilih Import, tempel URL itu, dan ia membuat koleksi dengan satu request untuk setiap endpoint. Sebagian besar API yang Anda uji di tempat kerja punya file serupa, dan itu cara tercepat untuk mulai mengenal API yang belum Anda kenal.

Environment dan variabel

Proyek sungguhan menjalankan API yang sama di beberapa tempat: laptop developer, server uji, staging, produksi. Request-nya sama kecuali base URL dan kredensialnya. Postman menangani ini dengan environment. Buat satu bernama "testingapis" dengan variabel baseUrl bernilai https://api.testingapis.com, lalu tulis URL request Anda sebagai {{baseUrl}}/api/Products/1. Berganti environment mengganti semua request sekaligus. Taruh token di variabel juga, agar tidak tersalin ke puluhan request.

Tes di Postman

Setiap request punya tab Tests (disebut Scripts, dengan bagian post-response, di versi yang lebih baru) tempat Anda bisa menulis JavaScript yang berjalan setelah response tiba. Untuk GET {{baseUrl}}/api/Products/1:

Tes Postman
pm.test("status is 200", function () {
  pm.response.to.have.status(200);
});

pm.test("product 1 has a price", function () {
  const product = pm.response.json();
  pm.expect(product.id).to.eql(1);
  pm.expect(product.price).to.be.a("number");
});

Hasilnya muncul di tab Test Results di samping response. Collection Runner kemudian bisa menjalankan setiap request di sebuah koleksi dan melaporkan pemeriksaan mana yang gagal. Ini langkah pertama yang ringan menuju otomatisasi. Pelajaran otomatisasi membahas cara menulis tes sebagai kode biasa, yang lebih mudah dikembangkan begitu jumlahnya lebih dari beberapa lusin.

Mana yang dipakai

Keduanya, untuk pekerjaan yang berbeda.

SituasiPilihan yang lebih baik
Memeriksa satu hal dengan cepat, atau mereproduksi laporan bugcurl
Membagikan request persis di tiket atau chatcurl (siapa pun bisa menempel dan menjalankannya)
Menjelajahi API yang belum Anda kenalKlien grafis dengan impor OpenAPI
Body JSON panjang yang Anda ubah berulang kaliKlien grafis
Berpindah antara server uji dan stagingEnvironment di klien grafis
Berjalan di dalam skrip atau di server buildcurl, atau tes yang ditulis dalam kode
Melihat header mentah dan detail koneksicurl -v

Satu opsi lagi khusus untuk API ini: setiap halaman endpoint di referensi API punya formulir untuk mengirim request dan menampilkan perintah curl siap salin. Sering kali itulah cara tercepat mencoba sebuah endpoint sebelum Anda menyimpannya di mana pun.

  • Saat laporan bug menyertakan request, lampirkan sebagai perintah curl. Developer bisa menjalankannya tanpa mengimpor apa pun, dan tidak ada keraguan soal header mana yang dikirim.
  • Postman bisa mengonversi dua arah. Tempel perintah curl ke dialog Import untuk mendapat request, atau gunakan tombol Code pada request untuk mendapat curl.

Latihan

Kerjakan ini dengan curl, lalu ulangi di klien grafis.

  • Kirim GET /api/echo/headers dan bandingkan header yang dikirim curl dengan yang dikirim klien grafis Anda. Header mana yang ditambahkan masing-masing alat dengan sendirinya?
  • Buat todo dengan POST /api/Todos, lalu ambil dengan GET /api/Todos/ diikuti ID dari response.
  • Kirim POST yang sama tanpa header Content-Type. Status dan body apa yang kembali?
  • Gunakan -w untuk mengukur waktu /api/Products dan /api/Products?delay=2. Parameter delay membuat server menunggu, jadi yang kedua seharusnya sekitar dua detik lebih lama.

Di klien grafis Anda, buat environment dengan variabel baseUrl dan tulis satu tes yang sengaja gagal, agar Anda tahu seperti apa kegagalan sebelum mengandalkan tes yang lulus.

Berlatih dan melangkah lebih jauh