curl ve jq ile Birlikte REST API'lerini Kullanma
Betiklerde canlı API yanıtlarını ayıklamak, sayfalandırmak ve yeniden biçimlendirmek için curl isteklerini jq ile zincirleyin.
curl ve jq ile Birlikte REST API'lerini Kullanma, CoddyKit'te ücretsiz bir DevOps Bootcamp dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, DevOps Bootcamp öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DevOps Bootcamp kursu toplamda 4 dersten oluşur.
curl + jq Neden Güçlü Bir İkilidir?
REST API'leri JSON döndürür. curl ham yanıtı getirir; jq ise bunu tek bir işlem hattında dilimler, filtreler ve yeniden biçimlendirir. Python betiğine, Postman'e veya aracı bir dosyaya gerek yoktur.
- curl HTTP işlemlerini yönetir: yöntemler, üst bilgiler, kimlik doğrulama ve yönlendirmeler.
- jq JSON'ı yönetir: filtreleme, eşleme, dönüştürme ve biçimlendirme.
- Bunları boruyla birbirine bağlamak, kısa ve birleştirilebilir API iş akışları oluşturur.
Bu derste söz konusu beceriyi temel ilkelerden başlayarak gerçek dünyadaki sayfalama ve betik örüntüleri üzerinden geliştireceksiniz.
jq'ya Temel curl İşlem Hattı
En basit örüntü, curl çıktısını doğrudan jq'ya yönlendirmektir. Yalnızca JSON gövdesinin jq'ya ulaşması için curl'un ilerleme göstergesini bastırmak üzere -s (sessiz) seçeneğini kullanın.
-s— sessiz kip, ilerleme çubuğu gösterilmez..— jq'nun kimlik filtresidir; yanıtın tamamını okunaklı biçimde yazdırır.- jq'da
-r— ham çıktı (dizelerin çevresinde tırnak bulunmaz).
#!/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'İstek Üst Bilgilerini Ayarlama ve Kimlik Doğrulama TOKEN'larını Geçirme
Üretim ortamındaki API'lerin çoğu bir Authorization üst bilgisi veya API anahtarı gerektirir. Üst bilgileri -H ile geçirin ve gizli bilgileri ortam değişkenlerinde saklayın; bunları hiçbir zaman doğrudan koda yazmayın.
-H 'Authorization: Bearer $TOKEN'— kimlik doğrulama üst bilgisini ekler.-H 'Accept: application/json'— yanıt olarak açıkça JSON ister.- Değişkenler çift tırnak içinde genişletilir; üst bilgi dizesinin çevresinde
"kullanın.
#!/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}'Dizileri Filtreleme — .[] ve select()
API'ler çoğunlukla diziler döndürür. Her öğe üzerinde yineleme yapmak için .[] kullanın, ardından yalnızca bir koşulla eşleşen öğeleri tutmak için select() kullanın.
.[]— bir diziyi nesne akışına açar.select(.field == value)— yalnızca eşleşen nesneleri tutar.- Birden fazla filtreyi
|ile birbirine bağlayın.
#!/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'map() ile Birden Çok Alanı Çıkarma
map(), bir dizinin her öğesine dönüşüm uygular ve yeni bir dizi döndürür; [.[] | ...] ile eşdeğerdir ancak daha okunabilirdir.
map({key: .field})— her nesneyi yeniden şekillendirir.- Tablo biçiminde çıktı üretmek için
@csvveya@tsvile birleştirin. - Ham metin elde etmek için
@csv/@tsvile-rkullanın (JSON tırnaklaması olmadan).
#!/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'Sayfalandırma Deseni — Boş Sayfaya Kadar Döngü
Çoğu API, sonuçları sayfalara böler. Yaygın bir desen, sayfa sayacını artıran ve döndürülen dizi boş olduğunda duran bir while döngüsüdür.
$(curl ...)ile curl yanıtını bir değişkende saklayın.- Sayfada öğe olup olmadığını denetlemek için
jq 'length'kullanın. - Sonuçları
jq -s(slurp) ile biriktirin veya bir dosyaya ekleyin.
#!/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")"Link Üstbilgisiyle Sayfalandırma (GitHub Tarzı)
GitHub ve diğer birçok API, sonraki sayfanın URL'sini sağlamak için Link yanıt üstbilgisini kullanır. URL'yi tahmin etmek yerine üstbilgiyi ayrıştırmanız gerekir.
curl -i, yanıt üstbilgilerini standart çıktıya dahil eder; üstbilgileri standart çıktıya dökmek için-D -da kullanabilirsiniz.Link: <url>; rel="next"üstbilgisinigrepvesedile ayrıştırın.rel="next"bağlantısı bulunmayana kadar döngüyü sürdürün.
#!/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)"İstekleri Zincirleme — Bir Çağrının Çıktısını Diğerinin Girdisi Olarak Kullanma
Yaygın bir iş akışı şöyledir: bir listeyi alın, bir ID çıkarın, ardından her ID için ayrıntıları alın. Ara değerleri $() komut ikamesiyle saklayıp sonraki URL'ye aktarın.
- Tek bir değeri
jq -r '.field'ile çıkarın. - Birden çok ID üzerinde
while readdöngüsü içindejq -r '.[].id'kullanarak döngü kurun. - Hız sınırlarına uymak için istekler arasında
sleepkullanın.
#!/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
donePOST İstekleri — JSON Yüklerini Gönderme
Kaynakları oluşturmak veya güncellemek için JSON gövdesiyle birlikte POST ya da PUT gönderin. Gövde için -X POST, -H 'Content-Type: application/json' ve -d kullanın. Tırnaklama sorunlarını önlemek için yükü jq -n ile oluşturun.
jq -n --arg key value '{key: $key}'— jq içinde güvenli değişken yerleştirme.- Oluşturulan JSON'u doğrudan curl'ün
-d @-seçeneğine yönlendirin (gövdeyi standart girdiden okur). - Yanıtı başka bir jq filtresiyle hemen ayrıştırın.
#!/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 '.'Hata İşleme — HTTP Durum Kodları ve API Hataları
Başarılı bir HTTP bağlantısı, API çağrısının da başarılı olduğu anlamına gelmez. HTTP durum kodunu ve JSON hata alanını ayrı ayrı denetleyin.
curl -w '%{http_code}', durum kodunu standart çıktıya ekler; gövdeyi bir dosyaya yazmak için-okullanın.- Kodu betiğinizde karşılaştırın ve 4xx/5xx durumlarını farklı şekilde işleyin.
- Birçok API, gövde içinde
{"error": "..."}barındırır; jq'ninhas()veyatypeişlevleriyle denetleyin.
#!/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"Yeniden Kullanılabilir API Yardımcı İşlevi Oluşturma
curl ve hata denetimi için gereken kalıp kodu bir kabuk işlevi içinde toplayın. İşlev; kimlik doğrulamasını, durum denetimini ve JSON çıkarma işlemini yönetir; çağıranlar yalnızca uç noktayı ve bir jq filtresini geçirir.
- HTTP hatalarında sıfır olmayan çıkış kodları döndürün; böylece çağıranlar
||veyaset -ekullanabilir. - Aynı işlevin birçok uç noktaya hizmet verebilmesi için bir jq filtresi bağımsız değişkeni kabul edin.
- API'ye ihtiyaç duyan tüm betiklerden bu işlev dosyasını kaynak olarak yükleyin.
#!/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)>"'Bilgi Kontrolü: Sayfalandırma Stratejisi
curl ve jq kullanarak Bash betiğinde sayfalandırılmış REST API yanıtlarının nasıl işleneceğini anlayıp anlamadığınızı test edin.
Ders Özeti: curl + jq ile API Betikleme
Artık Bash komut satırından REST API'lerini kullanmak için eksiksiz bir araç setine sahipsiniz:
- Temel işlem hattı:
curl -s URL | jq 'filter'— her şeyin temeli. - Kimlik doğrulama üstbilgileri: belirteçleri sabit kodlamak yerine ortam değişkenlerinden
-Haracılığıyla geçirin. - Dizi işleme:
.[],select()vemap(), API yanıtlarını parçalamanızı ve yeniden şekillendirmenizi sağlar. - Sayfalandırma: bir sayfa sayacıyla (boş dizi göstergesi) döngü kurun veya sonraki URL tarzı API'ler için
Linküstbilgilerini ayrıştırın. - Zincirleme: bir yanıttan ID'leri çıkarıp
while readdöngüsü içinde sonraki isteğe aktarın. - Güvenli yüklerle POST: JSON gövdelerini
jq -n --argkullanarak oluşturup curl'ün-d @-seçeneğine yönlendirin. - Hata işleme: HTTP durumunu (
-w '%{http_code}') gövdedeki API düzeyi hatalarından ayırın. - Yeniden kullanılabilir yardımcı: kalıp kodu bir kabuk işlevi içinde toplayarak betiklerin kısa ve DRY kalmasını sağlayın.
Bu desenleri birleştirerek tüm JSON API iş akışlarını doğrudan kabuktan otomatikleştirebilirsiniz; ek bir çalışma zamanı gerekmez.
Sıkça Sorulan Sorular
“curl ve jq ile Birlikte REST API'lerini Kullanma” dersi ücretsiz mi?
Evet — “curl ve jq ile Birlikte REST API'lerini Kullanma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve DevOps Bootcamp kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DevOps Bootcamp kursu toplamda 4 dersten oluşur.
“curl ve jq ile Birlikte REST API'lerini Kullanma” dersinde ne öğreneceğim?
Betiklerde canlı API yanıtlarını ayıklamak, sayfalandırmak ve yeniden biçimlendirmek için curl isteklerini jq ile zincirleyin. DevOps Bootcamp ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
DevOps Bootcamp öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te DevOps Bootcamp, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“curl ve jq ile Birlikte REST API'lerini Kullanma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu DevOps Bootcamp dersinde kod yazıp çalıştırabilir miyim?
Evet. Her DevOps Bootcamp dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- jq Pipeline'larıyla JSON Filtreleme ve Seçme
- jq ile JSON Nesnelerini Dönüştürme ve Oluşturma
- curl ve jq ile Birlikte REST API'lerini Kullanma
- yq ile YAML Yapılandırma Dosyalarını Düzenleme