DevOps बूटकैंप · पाठ

curl और jq से REST API का उपयोग

स्क्रिप्ट में लाइव API प्रतिक्रियाओं से डेटा निकालने, पृष्ठों में बाँटने और पुनः फ़ॉर्मैट करने के लिए curl अनुरोधों को jq से जोड़ें।

पाठ 3, कुल 4 में से13 चरण

curl और jq से REST API का उपयोग, CoddyKit पर DevOps बूटकैंप का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह DevOps बूटकैंप सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। DevOps बूटकैंप पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

curl + jq का शक्तिशाली संयोजन क्यों?

REST API JSON लौटाती हैं। curl कच्ची प्रतिक्रिया प्राप्त करता है; jq उसे काटता, फ़िल्टर करता और नए आकार में ढालता है — वह भी एक ही पाइपलाइन में। न Python स्क्रिप्ट, न Postman और न ही बीच की फ़ाइल की आवश्यकता।

  • curl HTTP संभालता है: विधियाँ, हेडर, प्रमाणीकरण और रीडायरेक्ट।
  • jq JSON संभालता है: फ़िल्टर करना, मैप करना, रूपांतरित करना और फ़ॉर्मैट करना।
  • दोनों को पाइप से जोड़ने पर संक्षिप्त और संयोजनीय API कार्यप्रवाह बनते हैं।

यह पाठ वास्तविक दुनिया में पृष्ठांकन और स्क्रिप्टिंग के प्रतिरूपों के माध्यम से इस कौशल को मूल सिद्धांतों से सिखाता है।

jq में जाने वाली मूल curl पाइपलाइन

सबसे सरल प्रतिरूप: curl के आउटपुट को सीधे jq में पाइप करें। प्रगति मीटर को छिपाने के लिए -s (silent) का उपयोग करें, ताकि केवल JSON का मुख्य भाग jq तक पहुँचे।

  • -s — शांत मोड, कोई प्रगति पट्टी नहीं।
  • . — jq का पहचान फ़िल्टर; पूरी प्रतिक्रिया को सुंदर ढंग से प्रिंट करता है।
  • jq पर -r — कच्चा आउटपुट (स्ट्रिंग के चारों ओर उद्धरण नहीं)।
#!/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'

अनुरोध हेडर सेट करना और प्रमाणीकरण टोकन देना

अधिकांश उत्पादन API के लिए Authorization हेडर या API कुंजी आवश्यक होती है। हेडर -H से दें और गुप्त मानों को पर्यावरण वैरिएबल में रखें — उन्हें कभी भी सीधे कोड में न लिखें।

  • -H 'Authorization: Bearer $TOKEN' — प्रमाणीकरण हेडर सम्मिलित करता है।
  • -H 'Accept: application/json' — स्पष्ट रूप से JSON वापस माँगता है।
  • डबल कोट के अंदर वैरिएबल का विस्तार होता है; हेडर स्ट्रिंग के चारों ओर " का उपयोग करें।
#!/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}'

ऐरे फ़िल्टर करना — .[] और select()

API अक्सर ऐरे लौटाती हैं। हर तत्व पर पुनरावृत्ति करने के लिए .[] का उपयोग करें, फिर किसी शर्त से मेल खाने वाले तत्व ही रखने के लिए select() लगाएँ।

  • .[] — ऐरे को ऑब्जेक्ट की धारा में खोलता है।
  • select(.field == value) — केवल मेल खाने वाले ऑब्जेक्ट रखता है।
  • कई फ़िल्टर को | से जोड़ें।
#!/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() से कई फ़ील्ड निकालना

map() किसी ऐरे के हर एलिमेंट पर रूपांतरण लागू करता है और एक नया ऐरे लौटाता है — यह [.[] | ...] के बराबर है, लेकिन अधिक पठनीय है।

  • map({key: .field}) — हर ऑब्जेक्ट का आकार बदलें।
  • तालिका के रूप में आउटपुट तैयार करने के लिए इसे @csv या @tsv के साथ मिलाएँ।
  • कच्चा टेक्स्ट पाने के लिए @csv/@tsv के साथ -r का उपयोग करें (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'

पृष्ठांकन पैटर्न — खाली पृष्ठ मिलने तक लूप चलाएँ

अधिकांश एपीआई परिणामों का पृष्ठांकन करते हैं। एक सामान्य पैटर्न while लूप है, जो पृष्ठ काउंटर बढ़ाता है और लौटाया गया ऐरे खाली होने पर रुक जाता है।

  • $(curl ...) की सहायता से curl की प्रतिक्रिया को एक वेरिएबल में रखें।
  • यह जाँचने के लिए jq 'length' का उपयोग करें कि पृष्ठ में आइटम हैं या नहीं।
  • jq -s (slurp) की सहायता से परिणामों को एकत्र करें या उन्हें किसी फ़ाइल में जोड़ें।
#!/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-Header पृष्ठांकन (GitHub शैली)

GitHub और कई अन्य एपीआई अगले पृष्ठ का URL देने के लिए Link प्रतिक्रिया हेडर का उपयोग करते हैं। URL का अनुमान लगाने के बजाय आपको हेडर को पार्स करना चाहिए।

  • curl -i प्रतिक्रिया हेडर को stdout में शामिल करता है; या हेडर को stdout में डंप करने के लिए -D - का उपयोग करें।
  • Link: <url>; rel="next" हेडर को grep और sed की सहायता से पार्स करें।
  • जब तक 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)"

अनुरोधों को जोड़ना — एक कॉल का आउटपुट दूसरी कॉल के इनपुट के रूप में उपयोग करें

एक सामान्य कार्यप्रवाह यह है: एक सूची प्राप्त करें, एक ID निकालें, फिर हर ID का विवरण प्राप्त करें। मध्यवर्ती मानों को $() कमांड सब्स्टिट्यूशन की सहायता से संग्रहीत करें और उन्हें अगले URL में भेजें।

  • jq -r '.field' की सहायता से एक मान निकालें।
  • while read लूप के अंदर jq -r '.[].id' की सहायता से कई IDs पर लूप चलाएँ।
  • दर सीमाओं का सम्मान करने के लिए अनुरोधों के बीच sleep का उपयोग करें।
#!/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 अनुरोध — JSON पेलोड भेजना

संसाधन बनाने या अपडेट करने के लिए JSON बॉडी के साथ POST या PUT भेजें। बॉडी के लिए -X POST, -H 'Content-Type: application/json' और -d का उपयोग करें। उद्धरण संबंधी समस्याओं से बचने के लिए पेलोड को jq -n की सहायता से बनाएँ।

  • jq -n --arg key value '{key: $key}' — jq में वेरिएबल का सुरक्षित प्रतिस्थापन।
  • बनाए गए JSON को सीधे curl के -d @- में पाइप करें (बॉडी stdin से पढ़ें)।
  • किसी अन्य jq फ़िल्टर की सहायता से प्रतिक्रिया को तुरंत पार्स करें।
#!/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 '.'

त्रुटि प्रबंधन — HTTP स्थिति कोड और एपीआई त्रुटियाँ

सफल HTTP कनेक्शन का अर्थ सफल एपीआई कॉल नहीं होता। HTTP स्थिति कोड और JSON त्रुटि फ़ील्ड की अलग-अलग जाँच करें।

  • curl -w '%{http_code}' स्थिति कोड को stdout के अंत में जोड़ता है; बॉडी को किसी फ़ाइल में लिखने के लिए -o का उपयोग करें।
  • अपने स्क्रिप्ट में कोड की तुलना करें और 4xx/5xx को अलग-अलग संभालें।
  • कई एपीआई बॉडी में {"error": "..."} शामिल करते हैं — jq के has() या type से जाँच करें।
#!/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"

पुनः उपयोग योग्य एपीआई सहायक फ़ंक्शन बनाना

curl और त्रुटि-जाँच के बार-बार लिखे जाने वाले कोड को एक शेल फ़ंक्शन में समेटें। यह फ़ंक्शन प्रमाणीकरण, स्थिति-जाँच और JSON निष्कर्षण संभालता है — कॉल करने वाले को केवल एंडपॉइंट और jq फ़िल्टर देना होता है।

  • HTTP त्रुटियों पर शून्य से अलग निकास कोड लौटाएँ, ताकि कॉल करने वाले || या set -e का उपयोग कर सकें।
  • एक jq फ़िल्टर आर्ग्युमेंट स्वीकार करें, ताकि वही फ़ंक्शन कई एंडपॉइंट के लिए काम आ सके।
  • जिस भी स्क्रिप्ट को एपीआई की आवश्यकता हो, उसमें इस फ़ंक्शन फ़ाइल को सोर्स करें।
#!/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)>"'

ज्ञान जाँच: पृष्ठांकन रणनीति

curl और jq का उपयोग करके Bash स्क्रिप्ट में पृष्ठांकित REST एपीआई प्रतिक्रियाओं को संभालने की अपनी समझ जाँचें।

पाठ का पुनरावलोकन: curl + jq एपीआई स्क्रिप्टिंग

अब आपके पास Bash कमांड लाइन से REST एपीआई का उपयोग करने के लिए एक पूरा टूलकिट है:

  • मूल पाइपलाइन: curl -s URL | jq 'filter' — हर चीज़ की नींव।
  • प्रमाणीकरण हेडर: टोकन को पर्यावरणीय वेरिएबल से -H के माध्यम से भेजें, उन्हें सीधे कोड में कभी न लिखें।
  • ऐरे प्रबंधन: .[], select() और map() एपीआई प्रतिक्रियाओं को छाँटते और उनका आकार बदलते हैं।
  • पृष्ठांकन: पृष्ठ काउंटर के साथ लूप चलाएँ (खाली ऐरे संकेतक) या अगले-URL शैली वाले एपीआई के लिए Link हेडर पार्स करें।
  • चेनिंग: एक प्रतिक्रिया से IDs निकालें और उन्हें while read लूप के अंदर अगले अनुरोध में भेजें।
  • सुरक्षित पेलोड के साथ POST: jq -n --arg का उपयोग करके JSON बॉडी बनाएँ और उसे curl के -d @- में पाइप करें।
  • त्रुटि प्रबंधन: HTTP स्थिति (-w '%{http_code}') को बॉडी में मौजूद एपीआई-स्तरीय त्रुटियों से अलग रखें।
  • पुनः उपयोग योग्य सहायक: बार-बार लिखे जाने वाले कोड को शेल फ़ंक्शन में समेटें, ताकि स्क्रिप्ट संक्षिप्त और DRY रहें।

इन पैटर्न को मिलाकर आप किसी भी JSON एपीआई कार्यप्रवाह को पूरी तरह शेल से स्वचालित कर सकते हैं — किसी अतिरिक्त रनटाइम की आवश्यकता नहीं है।

शुरुआत निःशुल्क

एआई शिक्षक के साथ DevOps बूटकैंप सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
142
पाठ
568

अक्सर पूछे जाने वाले प्रश्न

क्या “curl और jq से REST API का उपयोग” पाठ निःशुल्क है?

हाँ — DevOps बूटकैंप अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “curl और jq से REST API का उपयोग” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। DevOps बूटकैंप पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“curl और jq से REST API का उपयोग” में मैं क्या सीखूँगा?

स्क्रिप्ट में लाइव API प्रतिक्रियाओं से डेटा निकालने, पृष्ठों में बाँटने और पुनः फ़ॉर्मैट करने के लिए curl अनुरोधों को jq से जोड़ें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ DevOps बूटकैंप का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या DevOps बूटकैंप शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर DevOps बूटकैंप शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“curl और jq से REST API का उपयोग” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस DevOps बूटकैंप पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर DevOps बूटकैंप पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. jq पाइपलाइनों से JSON फ़िल्टर और चयन
  2. jq से JSON ऑब्जेक्ट बदलना और बनाना
  3. curl और jq से REST API का उपयोग
  4. yq से YAML कॉन्फ़िगरेशन फ़ाइलों का संपादन
← DevOps बूटकैंप पर वापस जाएँ