curl adalah Swiss Army knife HTTP. Lebih dari sekadar "download file" — ini alat debugging API yang wajib dikuasai developer.
Basic request:
curl https://api.example.com/users # GET (default)
curl -X POST https://api.example.com/users
curl -X DELETE https://api.example.com/users/1
Headers:
# Single header
curl -H "Authorization: Bearer abc123" https://api.example.com/me
# Multiple headers
curl -H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Request-Id: 42" \
https://api.example.com/endpoint
POST JSON body:
# -d = data body (implies -X POST)
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name":"Budi","age":25}'
# Data dari file
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d @user.json
Form data / file upload:
# application/x-www-form-urlencoded
curl -X POST https://example.com/login \
-d "username=budi&password=secret"
# multipart/form-data
curl -X POST https://example.com/upload \
-F "[email protected]" \
-F "description=My photo"
Authentication:
# Basic auth
curl -u username:password https://api.example.com/private
# Bearer token
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/me
# Digest auth
curl --digest -u user:pass https://...
Debugging flags (paling penting!):
-v # Verbose: tampilkan request + response headers
-I # Head only (hanya response headers)
-i # Include response headers di output
-s # Silent (no progress bar, useful for scripts)
-o file.json # Output ke file
-O # Output ke file dengan nama dari URL
-w "%{http_code}\n" # Tampilkan status code setelah response
Contoh workflow debugging API:
# Lihat semua yang dikirim dan diterima
curl -v https://api.example.com/users
# Hanya status code
curl -s -o /dev/null -w "%{http_code}\n" https://api.example.com/health
# Hanya response body, tanpa progress
curl -s https://api.example.com/users | jq
# Time breakdown (DNS, connect, TLS, time-to-first-byte, total)
curl -w "\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTLS: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
-o /dev/null -s \
https://api.example.com/users
Follow redirects:
curl -L https://bit.ly/shorturl # -L = follow 3xx redirects
Cookie handling:
# Save cookies to jar
curl -c cookies.txt -X POST https://example.com/login -d "user=a&pass=b"
# Send cookies from jar
curl -b cookies.txt https://example.com/dashboard
Proxy:
curl -x http://proxy:8080 https://example.com
curl --socks5 localhost:1080 https://example.com
Insecure (skip TLS verify):
curl -k https://self-signed.local # HANYA untuk debugging lokal!
Retry & timeout:
curl --max-time 10 https://slow.example.com # total 10s
curl --connect-timeout 5 https://example.com # connect 5s
curl --retry 3 --retry-delay 2 https://flaky.example.com
Export sebagai kode:
Banyak tool (Postman, DevTools → Copy as cURL) men-generate perintah curl. Sebaliknya, ada converter curl-to-code (ke Python, JavaScript, Go).
HTTPie sebagai alternatif:
# Lebih human-friendly
http POST api.example.com/users name=Budi age:=25
# vs
curl -X POST api.example.com/users -H "Content-Type: application/json" -d '{"name":"Budi","age":25}'
Tapi curl selalu tersedia default di hampir semua sistem — worth dikuasai.