Menggunakan API REST dengan curl dan jq Bersama-sama
Rangkaikan permintaan curl ke dalam jq untuk mengekstrak, menomborkan halaman dan memformat semula respons API langsung dalam skrip
Menggunakan API REST dengan curl dan jq Bersama-sama ialah pelajaran Kem Intensif DevOps percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kem Intensif DevOps, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kem Intensif DevOps merangkumi sejumlah 4 pelajaran.
Mengapa curl + jq ialah Gabungan Berkuasa
API REST mengembalikan JSON. curl mengambil respons mentah; jq menghiris, menapis dan membentuk semula respons itu — semuanya dalam satu saluran paip. Tiada skrip Python, tiada Postman dan tiada fail perantaraan diperlukan.
- curl mengendalikan HTTP: kaedah, pengepala, pengesahan dan ubah hala.
- jq mengendalikan JSON: penapisan, pemetaan, pengubahan dan pemformatan.
- Menyalurkan kedua-duanya bersama-sama menghasilkan aliran kerja API yang ringkas dan boleh digabungkan.
Pelajaran ini membina kemahiran tersebut daripada prinsip asas hingga corak penomboran halaman dan penskripan dunia sebenar.
Saluran Paip curl Asas ke jq
Corak paling mudah: salurkan output curl terus kepada jq. Gunakan -s (senyap) untuk menyekat meter kemajuan curl supaya hanya isi JSON sampai kepada jq.
-s— mod senyap, tanpa bar kemajuan..— penapis identiti jq; mencetak respons penuh dengan format yang kemas.-rpada jq — output mentah (tanpa tanda petik di sekeliling rentetan).
#!/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 Pengepala Permintaan dan Menghantar Token Pengesahan
Kebanyakan API pengeluaran memerlukan pengepala Authorization atau kunci API. Hantar pengepala dengan -H dan simpan rahsia dalam pemboleh ubah persekitaran — jangan sekali-kali tanamkan nilainya secara terus dalam kod.
-H 'Authorization: Bearer $TOKEN'— menyuntik pengepala pengesahan.-H 'Accept: application/json'— meminta JSON secara jelas.- Pemboleh ubah dikembangkan dalam tanda petik berganda; gunakan
"di sekeliling rentetan pengepala.
#!/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}'Menapis Tatasusunan — .[] dan select()
API sering mengembalikan tatasusunan. Gunakan .[] untuk mengulangi setiap elemen, kemudian select() untuk mengekalkan hanya item yang sepadan dengan syarat.
.[]— memecahkan tatasusunan menjadi aliran objek.select(.field == value)— hanya mengekalkan objek yang sepadan.- Rangkaikan berbilang penapis 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 Berbilang Medan dengan map()
map() menggunakan transformasi pada setiap elemen tatasusunan dan mengembalikan tatasusunan baharu — setara dengan [.[] | ...] tetapi lebih mudah dibaca.
map({key: .field})— menyusun semula setiap objek.- Gabungkan dengan
@csvatau@tsvuntuk menghasilkan output berbentuk jadual. - Gunakan
-rbersama@csv/@tsvuntuk mendapatkan teks mentah (tanpa petikan 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'Corak Penomboran Halaman — Ulang Gelung Sehingga Halaman Kosong
Kebanyakan API membahagikan hasil kepada beberapa halaman. Corak yang biasa digunakan ialah gelung while yang menambah pembilang halaman dan berhenti apabila tatasusunan yang dikembalikan kosong.
- Simpan respons curl dalam pemboleh ubah dengan
$(curl ...). - Gunakan
jq 'length'untuk memeriksa sama ada halaman tersebut mempunyai item. - Kumpulkan hasil dengan
jq -s(slurp) atau tambahkan hasil pada fail.
#!/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")"Penomboran Halaman melalui Pengepala Link (Gaya GitHub)
GitHub dan banyak API lain menggunakan pengepala respons Link untuk memberikan URL halaman seterusnya. Anda mesti menghuraikan pengepala tersebut dan bukannya meneka URL.
curl -imenyertakan pengepala respons dalam stdout; atau gunakan-D -untuk membuang pengepala ke stdout.- Huraikan pengepala
Link: <url>; rel="next"dengangrepdansed. - Ulang gelung sehingga tiada pautan
rel="next"lagi.
#!/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)"Merangkaikan Permintaan — Gunakan Output Satu Panggilan sebagai Input kepada Panggilan Lain
Aliran kerja yang biasa ialah mendapatkan senarai, mengekstrak ID, kemudian mendapatkan butiran bagi setiap ID. Simpan nilai perantaraan dengan penggantian perintah $() dan masukkannya ke dalam URL seterusnya.
- Ekstrak satu nilai dengan
jq -r '.field'. - Ulang gelung untuk berbilang ID dengan
jq -r '.[].id'dalam gelungwhile read. - Gunakan
sleepantara permintaan untuk mematuhi had kadar.
#!/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 — Menghantar Muatan JSON
Untuk mencipta atau mengemas kini sumber, hantar POST atau PUT dengan isi JSON. Gunakan -X POST, -H 'Content-Type: application/json', dan -d untuk isi tersebut. Bina muatan dengan jq -n bagi mengelakkan masalah petikan.
jq -n --arg key value '{key: $key}'— interpolasi pemboleh ubah yang selamat dalam jq.- Salurkan JSON yang dibina terus ke
-d @-curl (baca isi daripada stdin). - Huraikan respons dengan segera menggunakan penapis jq yang lain.
#!/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 '.'Pengendalian Ralat — Kod Status HTTP dan Ralat API
Sambungan HTTP yang berjaya tidak bermaksud panggilan API berjaya. Periksa kod status HTTP dan medan ralat JSON secara berasingan.
curl -w '%{http_code}'menambahkan kod status pada stdout; gunakan-ountuk menulis isi ke dalam fail.- Bandingkan kod tersebut dalam skrip anda dan kendalikan 4xx/5xx dengan cara yang berbeza.
- Banyak API menyertakan
{"error": "..."}dalam isi — periksa denganhas()atautypejq.
#!/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"Membina Fungsi Pembantu API yang Boleh Digunakan Semula
Bungkus kod boilerplate curl + pemeriksaan ralat ke dalam fungsi shell. Fungsi tersebut mengendalikan pengesahan, pemeriksaan status dan pengekstrakan JSON — pemanggil hanya perlu memberikan titik akhir dan penapis jq.
- Kembalikan kod keluar bukan sifar apabila berlaku ralat HTTP supaya pemanggil boleh menggunakan
||atauset -e. - Terima argumen penapis jq supaya fungsi yang sama boleh digunakan untuk banyak titik akhir.
- Muatkan fail fungsi ini daripada mana-mana skrip 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)>"'Semakan Pengetahuan: Strategi Penomboran Halaman
Uji pemahaman anda tentang cara mengendalikan respons REST API yang mempunyai penomboran halaman dalam skrip Bash menggunakan curl dan jq.
Imbas Kembali Pelajaran: Penskripan API curl + jq
Kini anda mempunyai set alat lengkap untuk menggunakan REST API daripada baris perintah Bash:
- Pipeline asas:
curl -s URL | jq 'filter'— asas bagi segala-galanya. - Pengepala pengesahan: hantar token melalui
-Hdaripada pemboleh ubah persekitaran, jangan sekali-kali mengekodkannya secara terus. - Pengendalian tatasusunan:
.[],select(), danmap()mengekstrak serta menyusun semula respons API. - Penomboran halaman: ulang gelung dengan pembilang halaman (penanda tatasusunan kosong) atau huraikan pengepala
Linkuntuk API yang menggunakan URL halaman seterusnya. - Perangkaian: ekstrak ID daripada satu respons dan masukkannya ke dalam permintaan seterusnya dalam gelung
while read. - POST dengan muatan selamat: bina isi JSON menggunakan
jq -n --argdan salurkannya ke-d @-curl. - Pengendalian ralat: asingkan status HTTP (
-w '%{http_code}') daripada ralat pada tahap API dalam isi respons. - Pembantu yang boleh digunakan semula: bungkus kod boilerplate dalam fungsi shell supaya skrip kekal ringkas dan mematuhi DRY.
Gabungkan corak-corak ini dan anda boleh mengautomasikan mana-mana aliran kerja API JSON sepenuhnya daripada shell — tanpa memerlukan persekitaran masa jalan tambahan.
Pelajari Kem Intensif DevOps dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 142
- Pelajaran
- 568
Soalan Lazim
Adakah pelajaran “Menggunakan API REST dengan curl dan jq Bersama-sama” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kem Intensif DevOps, termasuk “Menggunakan API REST dengan curl dan jq Bersama-sama”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Kem Intensif DevOps merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Menggunakan API REST dengan curl dan jq Bersama-sama”?
Rangkaikan permintaan curl ke dalam jq untuk mengekstrak, menomborkan halaman dan memformat semula respons API langsung dalam skrip Anda berlatih Kem Intensif DevOps menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Kem Intensif DevOps?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Kem Intensif DevOps di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Menggunakan API REST dengan curl dan jq Bersama-sama” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kem Intensif DevOps ini?
Ya. Setiap pelajaran Kem Intensif DevOps menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Menapis dan Memilih JSON dengan Saluran Paip jq
- Mengubah dan Membina Objek JSON dengan jq
- Menggunakan API REST dengan curl dan jq Bersama-sama
- Mengedit Fail Konfigurasi YAML dengan yq