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.-rpada 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
@csvatau@tsvuntuk menghasilkan keluaran berbentuk tabel. - Gunakan
-rdengan@csv/@tsvuntuk 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 -imenyertakan header respons dalam stdout; atau gunakan-D -untuk menuliskan header ke stdout.- Urai header
Link: <url>; rel="next"dengangrepdansed. - 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 perulanganwhile read. - Gunakan
sleepdi 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
donePermintaan 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-ountuk 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 denganhas()atautypemilik 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
||atauset -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
-Hdari variabel lingkungan, jangan pernah menuliskannya langsung. - Penanganan array:
.[],select(), danmap()memotong serta menyusun ulang respons API. - Pagination: lakukan perulangan dengan penghitung halaman (penanda array kosong) atau urai header
Linkuntuk 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 --argdan 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
- Menyaring dan Memilih JSON dengan Pipeline jq
- Mengubah dan Membangun Objek JSON dengan jq
- Menggunakan REST API dengan curl dan jq Bersama-sama
- Mengedit File Konfigurasi YAML dengan yq