0Pricing
DevOps Bootcamp · Pelajaran

Menggunakan REST API dengan curl dan jq Bersama-sama

Rangkai permintaan curl ke dalam jq untuk mengekstrak, melakukan paginasi, dan memformat ulang respons API langsung dalam skrip.

Menggunakan REST API dengan curl dan jq Bersama-sama adalah pelajaran DevOps Bootcamp gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar DevOps Bootcamp, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus DevOps Bootcamp mencakup 4 pelajaran total.

Mengapa curl + jq Merupakan Kombinasi Unggul

API REST mengembalikan JSON. curl mengambil respons mentah; jq memotong, memfilter, dan mengubah bentuknya—semuanya dalam satu alur pemrosesan. Tidak perlu skrip Python, Postman, atau berkas perantara.

  • curl menangani HTTP: metode, header, autentikasi, dan pengalihan.
  • jq menangani JSON: pemfilteran, pemetaan, transformasi, dan pemformatan.
  • Menyambungkan keduanya melalui pipa menghasilkan alur kerja API yang ringkas dan dapat dikomposisikan.

Pelajaran ini membangun keterampilan tersebut dari prinsip dasar hingga pola paginasi dan pembuatan skrip di dunia nyata.

Alur Pemrosesan Dasar dari curl ke jq

Pola paling sederhana: teruskan keluaran curl langsung ke jq. Gunakan -s (senyap) untuk menyembunyikan pengukur kemajuan curl sehingga hanya isi JSON yang diteruskan ke jq.

  • -s — mode senyap, tanpa bilah kemajuan.
  • . — filter identitas jq; mencetak respons lengkap dengan format rapi.
  • -r pada jq — keluaran mentah (tanpa tanda kutip di sekitar string).
#!/usr/bin/env bash
# Fetch a public endpoint and pretty-print the JSON
curl -s 'https://jsonplaceholder.typicode.com/todos/1' | jq '.'

# Extract just the title field as a plain string
curl -s 'https://jsonplaceholder.typicode.com/todos/1' | jq -r '.title'

Menetapkan Header Permintaan dan Meneruskan Token Autentikasi

Sebagian besar API produksi memerlukan header Authorization atau kunci API. Teruskan header dengan -H dan simpan rahasia dalam variabel lingkungan—jangan pernah menuliskannya secara langsung di kode.

  • -H 'Authorization: Bearer $TOKEN' — menyisipkan header autentikasi.
  • -H 'Accept: application/json' — secara eksplisit meminta respons JSON.
  • Variabel diperluas di dalam tanda kutip ganda; gunakan " untuk mengapit string header.
#!/usr/bin/env bash
TOKEN="${GITHUB_TOKEN}"   # set in your shell environment
USER="octocat"

curl -s \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Accept: application/vnd.github+json" \
  "https://api.github.com/users/${USER}" \
| jq '{login: .login, repos: .public_repos, followers: .followers}'

Memfilter Array — .[] dan select()

API sering kali mengembalikan array. Gunakan .[] untuk melakukan iterasi pada setiap elemen, lalu select() untuk mempertahankan hanya item yang sesuai dengan suatu kondisi.

  • .[] — memecah array menjadi aliran objek.
  • select(.field == value) — hanya mempertahankan objek yang sesuai.
  • Rangkaikan beberapa filter dengan |.
#!/usr/bin/env bash
# Fetch all todos and keep only the completed ones
curl -s 'https://jsonplaceholder.typicode.com/todos' \
| jq '[.[] | select(.completed == true) | {id, title}]'

# Count how many are completed
curl -s 'https://jsonplaceholder.typicode.com/todos' \
| jq '[.[] | select(.completed == true)] | length'

Mengekstrak Beberapa Bidang dengan map()

map() menerapkan transformasi ke setiap elemen array dan mengembalikan array baru — setara dengan [.[] | ...], tetapi lebih mudah dibaca.

  • map({key: .field}) — menyusun ulang setiap objek.
  • Gabungkan dengan @csv atau @tsv untuk menghasilkan keluaran berbentuk tabel.
  • Gunakan -r dengan @csv/@tsv untuk mendapatkan teks mentah (tanpa pengutipan JSON).
#!/usr/bin/env bash
# Reshape a posts list into id + title pairs
curl -s 'https://jsonplaceholder.typicode.com/posts' \
| jq 'map({id, title: .title[0:40]})'

# Output as CSV for import into a spreadsheet
curl -s 'https://jsonplaceholder.typicode.com/posts' \
| jq -r '.[] | [.id, .userId, .title] | @csv'

Pola Pagination — Mengulang hingga Halaman Kosong

Sebagian besar API membagi hasil ke dalam beberapa halaman. Pola yang umum adalah perulangan while yang menambah penghitung halaman dan berhenti ketika array yang dikembalikan kosong.

  • Simpan respons curl ke dalam variabel dengan $(curl ...).
  • Gunakan jq 'length' untuk memeriksa apakah halaman tersebut berisi item.
  • Akumulasikan hasil dengan jq -s (slurp) atau tambahkan ke sebuah file.
#!/usr/bin/env bash
# Paginate through jsonplaceholder posts (simulated: page stops at page 2
# because the API returns the full list regardless of ?_page, but the
# pattern is correct for real paginated APIs)

PAGE=1
PER_PAGE=10
OUTPUT="all_posts.json"
echo '[]' > "$OUTPUT"

while true; do
  RESPONSE=$(curl -s "https://jsonplaceholder.typicode.com/posts?_page=${PAGE}&_limit=${PER_PAGE}")
  COUNT=$(echo "$RESPONSE" | jq 'length')

  if [ "$COUNT" -eq 0 ]; then
    echo "No more pages. Stopping at page $((PAGE - 1))."
    break
  fi

  # Merge new items into the accumulated JSON array
  CURRENT=$(cat "$OUTPUT")
  echo "$CURRENT" "$RESPONSE" | jq -s '.[0] + .[1]' > "$OUTPUT"
  echo "Page $PAGE: fetched $COUNT items."
  PAGE=$((PAGE + 1))
done

echo "Total collected: $(jq 'length' "$OUTPUT")"

Pagination dengan Header Link (Gaya GitHub)

GitHub dan banyak API lainnya menggunakan header respons Link untuk menyediakan URL halaman berikutnya. Anda harus mengurai header tersebut, bukan menebak URL-nya.

  • curl -i menyertakan header respons dalam stdout; atau gunakan -D - untuk menuliskan header ke stdout.
  • Urai header Link: <url>; rel="next" dengan grep dan sed.
  • Lakukan perulangan hingga tidak ada tautan rel="next".
#!/usr/bin/env bash
# Follow Link-header pagination (GitHub repos example)
# Requires GITHUB_TOKEN in environment
TOKEN="${GITHUB_TOKEN}"
NEXT_URL="https://api.github.com/users/torvalds/repos?per_page=5"
ALL_REPOS="[]"

while [ -n "$NEXT_URL" ]; do
  # Capture full response (headers + body) to a temp file
  TMPFILE=$(mktemp)
  curl -sD "$TMPFILE" \
    -H "Authorization: Bearer ${TOKEN}" \
    -H "Accept: application/vnd.github+json" \
    "$NEXT_URL" \
  | {
      BODY=$(cat)
      ALL_REPOS=$(echo "$ALL_REPOS" "$BODY" | jq -s '.[0] + .[1]')
      echo "$ALL_REPOS" > /tmp/repos_acc.json
    }

  # Extract next URL from Link header
  NEXT_URL=$(grep -i '^link:' "$TMPFILE" \
    | sed -E 's/.*<([^>]+)>; rel="next".*/\1/;t;d')
  rm -f "$TMPFILE"
done

echo "Total repos: $(jq 'length' /tmp/repos_acc.json)"

Merangkai Permintaan — Menggunakan Keluaran Satu Panggilan sebagai Masukan untuk Panggilan Lain

Alur kerja yang umum: ambil sebuah daftar, ekstrak sebuah ID, lalu ambil detail untuk setiap ID. Simpan nilai perantara dengan substitusi perintah $() dan masukkan nilai tersebut ke URL berikutnya.

  • Ekstrak satu nilai dengan jq -r '.field'.
  • Lakukan perulangan pada beberapa ID dengan jq -r '.[].id' di dalam perulangan while read.
  • Gunakan sleep di antara permintaan untuk mematuhi batas laju.
#!/usr/bin/env bash
# Step 1: get all user IDs from the /users endpoint
# Step 2: for each user, fetch their posts and count them

curl -s 'https://jsonplaceholder.typicode.com/users' \
| jq -r '.[].id' \
| while read -r USER_ID; do
    POST_COUNT=$(curl -s "https://jsonplaceholder.typicode.com/posts?userId=${USER_ID}" \
                 | jq 'length')
    echo "User ${USER_ID}: ${POST_COUNT} posts"
    sleep 0.1   # be polite to the API
done

Permintaan POST — Mengirim Payload JSON

Untuk membuat atau memperbarui sumber daya, kirim POST atau PUT dengan isi JSON. Gunakan -X POST, -H 'Content-Type: application/json', dan -d untuk isi tersebut. Buat payload dengan jq -n untuk menghindari masalah pengutipan.

  • jq -n --arg key value '{key: $key}' — interpolasi variabel yang aman dalam jq.
  • Alirkan JSON yang dibuat langsung ke -d @- milik curl (membaca isi dari stdin).
  • Urai respons segera dengan filter jq lainnya.
#!/usr/bin/env bash
TITLE="My New Post"
BODY_TEXT="Written via curl and jq."
USER_ID=1

# Build the JSON payload safely and POST it
RESPONSE=$(jq -n \
  --arg title   "$TITLE" \
  --arg body    "$BODY_TEXT" \
  --argjson userId "$USER_ID" \
  '{title: $title, body: $body, userId: $userId}' \
| curl -s \
    -X POST \
    -H 'Content-Type: application/json' \
    -d @- \
    'https://jsonplaceholder.typicode.com/posts')

echo "Created post ID: $(echo "$RESPONSE" | jq '.id')"
echo "Full response:"
echo "$RESPONSE" | jq '.'

Penanganan Error — Kode Status HTTP dan Error API

Koneksi HTTP yang berhasil tidak berarti panggilan API berhasil. Periksa kode status HTTP dan bidang error JSON secara terpisah.

  • curl -w '%{http_code}' menambahkan kode status ke stdout; gunakan -o untuk menulis isi ke sebuah file.
  • Bandingkan kode tersebut dalam skrip Anda dan tangani 4xx/5xx secara berbeda.
  • Banyak API menyematkan {"error": "..."} dalam isi respons — periksa dengan has() atau type milik jq.
#!/usr/bin/env bash
API_URL='https://jsonplaceholder.typicode.com/todos/99999'
TMPBODY=$(mktemp)

HTTP_CODE=$(curl -s -o "$TMPBODY" -w '%{http_code}' "$API_URL")

if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ]; then
  echo "Success ($HTTP_CODE):"
  jq '.' "$TMPBODY"
elif [ "$HTTP_CODE" -eq 404 ]; then
  echo "Resource not found (404). Body:"
  jq '.' "$TMPBODY"
elif [ "$HTTP_CODE" -ge 500 ]; then
  echo "Server error ($HTTP_CODE). Retrying later."
else
  echo "Unexpected status: $HTTP_CODE"
  cat "$TMPBODY"
fi

rm -f "$TMPBODY"

Membangun Fungsi Pembantu API yang Dapat Digunakan Kembali

Bungkus kode boilerplate curl + pemeriksaan error ke dalam fungsi shell. Fungsi ini menangani autentikasi, pemeriksaan status, dan ekstraksi JSON — pemanggil cukup meneruskan endpoint dan filter jq.

  • Kembalikan kode keluar non-nol untuk error HTTP agar pemanggil dapat menggunakan || atau set -e.
  • Terima argumen filter jq agar fungsi yang sama dapat melayani banyak endpoint.
  • Muat file fungsi ini dari skrip mana pun yang memerlukan API.
#!/usr/bin/env bash
# api_get <endpoint_path> <jq_filter>
# Returns filtered JSON or exits non-zero on error.
api_get() {
  local PATH_PART="$1"
  local JQ_FILTER="${2:-.}"
  local BASE_URL='https://jsonplaceholder.typicode.com'
  local TMPBODY
  TMPBODY=$(mktemp)

  local HTTP_CODE
  HTTP_CODE=$(curl -s \
    -o "$TMPBODY" \
    -w '%{http_code}' \
    "${BASE_URL}${PATH_PART}")

  if [ "$HTTP_CODE" -lt 200 ] || [ "$HTTP_CODE" -ge 300 ]; then
    echo "[ERROR] HTTP $HTTP_CODE for ${PATH_PART}" >&2
    rm -f "$TMPBODY"
    return 1
  fi

  jq -r "$JQ_FILTER" "$TMPBODY"
  rm -f "$TMPBODY"
}

# Usage examples
api_get '/todos/1' '.title'
api_get '/posts?userId=1' '[.[] | .title]'
api_get '/users' '.[] | "\(.id) \(.name) <\(.email)>"'

Uji Pemahaman: Strategi Pagination

Uji pemahaman Anda tentang cara menangani respons REST API yang menggunakan pagination dalam skrip Bash dengan curl dan jq.

Ringkasan Pelajaran: Skrip API dengan curl + jq

Sekarang Anda memiliki perangkat lengkap untuk menggunakan REST API dari baris perintah Bash:

  • Pipeline dasar: curl -s URL | jq 'filter' — dasar dari semuanya.
  • Header autentikasi: teruskan token melalui -H dari variabel lingkungan, jangan pernah menuliskannya langsung.
  • Penanganan array: .[], select(), dan map() memotong serta menyusun ulang respons API.
  • Pagination: lakukan perulangan dengan penghitung halaman (penanda array kosong) atau urai header Link untuk API bergaya URL berikutnya.
  • Perangkaian: ekstrak ID dari satu respons dan masukkan ke permintaan berikutnya di dalam perulangan while read.
  • POST dengan payload aman: buat isi JSON menggunakan jq -n --arg dan alirkan ke -d @- milik curl.
  • Penanganan error: pisahkan status HTTP (-w '%{http_code}') dari error tingkat API dalam isi respons.
  • Pembantu yang dapat digunakan kembali: bungkus kode boilerplate dalam fungsi shell agar skrip tetap ringkas dan DRY.

Gabungkan pola-pola ini dan Anda dapat mengotomatiskan alur kerja API JSON apa pun sepenuhnya dari shell — tanpa runtime tambahan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menggunakan REST API dengan curl dan jq Bersama-sama” gratis?

Ya — teks lengkap “Menggunakan REST API dengan curl dan jq Bersama-sama” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus DevOps Bootcamp, upgrade ke CoddyKit PRO. Kursus DevOps Bootcamp mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menggunakan REST API dengan curl dan jq Bersama-sama”?

Rangkai permintaan curl ke dalam jq untuk mengekstrak, melakukan paginasi, dan memformat ulang respons API langsung dalam skrip. Kamu berlatih DevOps Bootcamp dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai DevOps Bootcamp?

Tidak diperlukan pengalaman sebelumnya. DevOps Bootcamp di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Menggunakan REST API dengan curl dan jq Bersama-sama” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran DevOps Bootcamp ini?

Ya. Setiap pelajaran DevOps Bootcamp menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menyaring dan Memilih JSON dengan Pipeline jq
  2. Mengubah dan Membangun Objek JSON dengan jq
  3. Menggunakan REST API dengan curl dan jq Bersama-sama
  4. Mengedit File Konfigurasi YAML dengan yq
← Kembali ke DevOps Bootcamp