curl — Deep Dive — Terminal

curl adalah Swiss Army knife HTTP. Lebih dari sekadar "download file" — ini alat debugging API yang wajib dikuasai developer. Basic request: curl https://api.ex

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.