0Pricing
DevOps Bootcamp · Ders

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 @csv veya @tsv ile birleştirin.
  • Ham metin elde etmek için @csv/@tsv ile -r kullanı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" üstbilgisini grep ve sed ile 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 read döngüsü içinde jq -r '.[].id' kullanarak döngü kurun.
  • Hız sınırlarına uymak için istekler arasında sleep kullanı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
done

POST İ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 -o kullanı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'nin has() veya type iş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 || veya set -e kullanabilir.
  • 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 -H aracılığıyla geçirin.
  • Dizi işleme: .[], select() ve map(), 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 read döngüsü içinde sonraki isteğe aktarın.
  • Güvenli yüklerle POST: JSON gövdelerini jq -n --arg kullanarak 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

  1. jq Pipeline'larıyla JSON Filtreleme ve Seçme
  2. jq ile JSON Nesnelerini Dönüştürme ve Oluşturma
  3. curl ve jq ile Birlikte REST API'lerini Kullanma
  4. yq ile YAML Yapılandırma Dosyalarını Düzenleme
← DevOps Bootcamp Sayfasına Dön