HTTP स्टेटस कोड समझें
HTTP स्टेटस कोड वह तीन अंकों की संख्या है जो सर्वर हर रिस्पॉन्स के साथ भेजता है ताकि बताए कि रिक्वेस्ट का क्या हुआ। पहला अंक क्लास बताता है — सफलता, रीडायरेक्ट, क्लाइंट एरर, सर्वर एरर — और पूरा कोड खास वजह। इन्हें सही पढ़ना API समस्या डायग्नोज़ करने का सबसे तेज़ तरीका है, और इन्हें सही चुनना अच्छी तरह डिज़ाइन किए API की सबसे साफ़ निशानियों में से एक।
यह गाइड पाँच क्लास, रोज़ मिलने वाले कोड, मिलते-जुलते कोड (401 बनाम 403, 301 बनाम 302, 502 बनाम 504) का फ़र्क़, और हर स्थिति में आपके अपने API को कौन-सा कोड लौटाना चाहिए, यह समझाती है।
पाँच क्लास
- 1xx Informational — रिक्वेस्ट मिल गई और प्रोसेसिंग जारी है (100 Continue, 101 Switching Protocols)। एप्लिकेशन कोड में शायद ही दिखते हैं।
- 2xx Success — रिक्वेस्ट समझी और स्वीकार की गई।
- 3xx Redirection — क्लाइंट को कुछ और करना होगा, आमतौर पर नए URL पर जाना।
- 4xx Client error — रिक्वेस्ट गलत है: ख़राब सिंटैक्स, ऑथ गायब, ऐसा कोई रिसोर्स नहीं। बिना बदले दोबारा भेजने पर आमतौर पर वही जवाब मिलता है; अपवाद कोड ख़ुद बताता है, जैसे 429 (बाद में दोबारा भेजें, Retry-After भेजा गया हो तो उसके समय के बाद) और 408 (रिक्वेस्ट दोहराई जा सकती है)।
- 5xx Server error — रिक्वेस्ट वैध थी लेकिन सर्वर फ़ेल हुआ। फ़ेलियर अस्थायी हो (502, 503, 504) तो बैकऑफ़ के साथ दोबारा कोशिश मदद कर सकती है, लेकिन अपने-आप सिर्फ़ idempotent रिक्वेस्ट (जैसे GET, PUT, DELETE) ही दोहराएँ; 501 दोबारा कोशिश से नहीं बदलेगा।
2xx: सफलता कोड
- 200 OK — स्टैंडर्ड सफलता; बॉडी में नतीजा है।
- 201 Created — रिसोर्स बना (POST या PUT के बाद); Location हेडर उसकी ओर इशारा करता है।
- 202 Accepted — रिक्वेस्ट असिंक्रोनस प्रोसेसिंग के लिए कतार में है; अभी पूरी नहीं हुई।
- 204 No Content — बिना बॉडी सफलता (DELETE और कुछ PUT/PATCH में आम)।
- 206 Partial Content — बाइट रेंज लौटाई गई, रिज़्यूमेबल डाउनलोड और वीडियो में इस्तेमाल।
3xx: रीडायरेक्ट
- 301 Moved Permanently — URL स्थायी रूप से बदल गया; ब्राउज़र और सर्च इंजन अपने रिकॉर्ड अपडेट करते हैं। कैनोनिकल URL बदलाव के लिए।
- 302 Found — अस्थायी रीडायरेक्ट; मूल URL ही कैनोनिकल रहता है। मेथड GET में बदल सकता है।
- 303 See Other — POST के बाद इस दूसरे URL पर GET करो (post/redirect/get पैटर्न)।
- 304 Not Modified — कैश की कॉपी अब भी वैध है; कोई बॉडी नहीं भेजी जाती। कैशिंग काम करने की निशानी।
- 307 / 308 — अस्थायी और स्थायी रीडायरेक्ट जो मेथड और बॉडी बनाए रखने की गारंटी देते हैं। API के लिए 301 की जगह 308 चुनें।
4xx: क्लाइंट एरर
- 400 Bad Request — बिगड़ा सिंटैक्स या अवैध पैरामीटर; सामान्य वैलिडेशन एरर।
- 401 Unauthorized — कोई वैध क्रेडेंशियल नहीं। नाम के बावजूद इसका मतलब "ऑथेंटिकेटेड नहीं"। WWW-Authenticate हेडर भेजें।
- 403 Forbidden — ऑथेंटिकेटेड, लेकिन यह करने की अनुमति नहीं। उन्हीं क्रेडेंशियल से दोबारा कोशिश बेकार है।
- 404 Not Found — इस URL पर कोई रिसोर्स नहीं (या सर्वर बताना नहीं चाहता कि वह मौजूद है)।
- 405 Method Not Allowed — URL मौजूद है लेकिन इस मेथड के लिए नहीं (जैसे read-only रिसोर्स पर DELETE)। Allow हेडर शामिल करें।
- 409 Conflict — रिक्वेस्ट मौजूदा स्टेट से टकराती है: डुप्लिकेट यूनिक key, पुराना वर्ज़न, पहले ही प्रोसेस हो चुका।
- 410 Gone — कभी था, जानबूझकर हटाया गया, वापस नहीं आएगा।
- 415 Unsupported Media Type — रिक्वेस्ट बॉडी पर गलत Content-Type।
- 422 Unprocessable Content (पहले Unprocessable Entity) — सिंटैक्स ठीक है लेकिन वैल्यू वैलिडेशन में फ़ेल। फ़ील्ड-लेवल एरर के लिए व्यापक इस्तेमाल।
- 429 Too Many Requests — रेट लिमिट पार; Retry-After हेडर बताता है कब दोबारा कोशिश करें।
आज़माएँ: API स्टेटस कोड सिम्युलेटर आज़माएँ: HTTP स्टेटस एनालाइज़र
5xx: सर्वर एरर
- 500 Internal Server Error — अनहैंडल्ड एक्सेप्शन। ख़राब इनपुट का कभी सही जवाब नहीं; इसका मतलब है वैलिडेशन गायब है।
- 501 Not Implemented — सर्वर उस मेथड को बिल्कुल सपोर्ट नहीं करता।
- 502 Bad Gateway — प्रॉक्सी या लोड बैलेंसर को अपस्ट्रीम सर्वर से अवैध रिस्पॉन्स मिला (वह क्रैश हुआ, या कचरा भेजा)।
- 503 Service Unavailable — सर्वर ओवरलोडेड है या मेंटेनेंस में; अस्थायी। Retry-After भेजें।
- 504 Gateway Timeout — प्रॉक्सी ने अपस्ट्रीम का इंतज़ार किया और उसने समय पर जवाब नहीं दिया।
500 Internal Server Error- क्लाइंट
- सर्वर
- 1 क्लाइंट से सर्वर तक: रिक्वेस्ट
- 2 सर्वर आंतरिक रूप से: अनहैंडल्ड एक्सेप्शन
- 3 सर्वर से क्लाइंट तक:
500जवाब
502 Bad Gateway- क्लाइंट
- प्रॉक्सी या लोड बैलेंसर
- अपस्ट्रीम सर्वर
- 1 क्लाइंट से प्रॉक्सी या लोड बैलेंसर तक: रिक्वेस्ट
- 2 प्रॉक्सी या लोड बैलेंसर से अपस्ट्रीम सर्वर तक: रिक्वेस्ट आगे भेजता है
- 3 अपस्ट्रीम सर्वर से प्रॉक्सी या लोड बैलेंसर तक: अवैध रिस्पॉन्स जवाब वह क्रैश हुआ, या कचरा भेजा
- 4 प्रॉक्सी या लोड बैलेंसर से क्लाइंट तक:
502जवाब
परिणाम: प्रॉक्सी जवाब देता है: अपस्ट्रीम ने कचरा लौटाया।
503 Service Unavailable- क्लाइंट
- सर्वर
- 1 क्लाइंट से सर्वर तक: रिक्वेस्ट
- 2 सर्वर आंतरिक रूप से: ओवरलोडेड या मेंटेनेंस में
- 3 सर्वर से क्लाइंट तक:
503जवाब
परिणाम: अस्थायी: सर्वर को
Retry-Afterहेडर भेजना चाहिए।504 Gateway Timeout- क्लाइंट
- प्रॉक्सी या लोड बैलेंसर
- अपस्ट्रीम सर्वर
- 1 क्लाइंट से प्रॉक्सी या लोड बैलेंसर तक: रिक्वेस्ट
- 2 प्रॉक्सी या लोड बैलेंसर से अपस्ट्रीम सर्वर तक: रिक्वेस्ट आगे भेजता है
- 3 प्रॉक्सी या लोड बैलेंसर आंतरिक रूप से: इंतज़ार: समय पर जवाब नहीं
- 4 प्रॉक्सी या लोड बैलेंसर से क्लाइंट तक:
504जवाब
परिणाम: प्रॉक्सी जवाब देता है: अपस्ट्रीम बहुत धीमा था।
फ़ेलियर अस्थायी हो (502, 503, 504) तो बैकऑफ़ के साथ दोबारा कोशिश मदद कर सकती है, लेकिन अपने-आप सिर्फ़ idempotent रिक्वेस्ट (जैसे GET, PUT, DELETE) ही दोहराएँ।
जिन कोड में लोग उलझते हैं
- 401 बनाम 403 — 401: आप कौन हैं? (लॉग इन करें)। 403: मैं जानता हूँ आप कौन हैं, और जवाब है नहीं।
- 301 बनाम 302 बनाम 308 — स्थायी बनाम अस्थायी; 308 POST को POST ही रखता है।
- 400 बनाम 422 — 400 पार्स न हो सकने वाली या स्ट्रक्चर में गलत रिक्वेस्ट के लिए, 422 सही-बनी लेकिन अवैध वैल्यू वाली रिक्वेस्ट के लिए। एक कन्वेंशन चुनें और उसी पर टिके रहें।
- 502 बनाम 503 बनाम 504 — अपस्ट्रीम ने कचरा लौटाया बनाम सर्वर उपलब्ध नहीं बनाम अपस्ट्रीम बहुत धीमा।
- 404 बनाम 410 — अनजान बनाम जानबूझकर हटाया गया।
आपके API को कौन-सा कोड लौटाना चाहिए?
सबसे खास कोड लौटाएँ जो सच हो, उसे एकसमान इस्तेमाल करें, और हमेशा स्थिर मशीन-रीडेबल कोड और इंसानी भाषा के मैसेज वाली JSON एरर बॉडी भेजें। फ़ेलियर को कभी 200 में न लपेटें — क्लाइंट और मॉनिटरिंग दोनों स्टेटस लाइन पर निर्भर हैं। 429 और Retry-After से रेट-लिमिट करें, 400/422 से वैलिडेट करें, 401 से ऑथेंटिकेट, 403 से ऑथराइज़, और 500 उन बग के लिए रखें जिन्हें आप ठीक करने वाले हैं।
आज़माएँ: API रिक्वेस्ट बिल्डर आज़माएँ: API स्टेटस कोड सिम्युलेटर
अक्सर पूछे जाने वाले सवाल
HTTP स्टेटस 200 का क्या मतलब है?
OK — रिक्वेस्ट सफल रही और रिस्पॉन्स बॉडी में नतीजा है। यह GET का डिफ़ॉल्ट सफलता कोड है।
401 और 403 में क्या फ़र्क़ है?
401 का मतलब रिक्वेस्ट में कोई वैध ऑथेंटिकेशन नहीं है (लॉग इन करें या टोकन भेजें)। 403 का मतलब पहचान पता है लेकिन वह एक्शन अनुमत नहीं।
502 Bad Gateway का क्या मतलब है?
एप्लिकेशन के सामने के प्रॉक्सी या लोड बैलेंसर को उससे अवैध रिस्पॉन्स मिला या कोई रिस्पॉन्स मिल ही नहीं पाया — आमतौर पर एप्लिकेशन सर्वर क्रैश हुआ, रीस्टार्ट हुआ या उसने कनेक्शन तोड़ दिया। अगर अपस्ट्रीम सिर्फ़ जवाब देने में बहुत धीमा हो, तो प्रॉक्सी इसके बजाय 504 लौटाता है।
429 Too Many Requests का क्या मतलब है?
क्लाइंट ने रेट लिमिट पार कर दी है। और रिक्वेस्ट भेजने से पहले Retry-After हेडर में दिए समय तक रुकें।
वैलिडेशन एरर पर 400 लौटाएँ या 422?
दोनों स्वीकार्य हैं; 400 क्लासिक विकल्प है, 422 आधुनिक API में फ़ील्ड-लेवल वैलिडेशन के लिए आम है। चुनाव से ज़्यादा पूरे API में एकरूपता मायने रखती है।
क्या 304 Not Modified एरर है?
नहीं। इसका मतलब है क्लाइंट की कैश कॉपी अब भी ताज़ा है, इसलिए सर्वर ने बॉडी नहीं भेजी। यह बैंडविड्थ बचाता है और कैशिंग हेडर काम करने की निशानी है।
संदर्भ
- RFC 9110: HTTP SemanticsHTTP मेथड, हेडर फ़ील्ड, स्टेटस कोड और कंटेंट निगोशिएशन के अर्थ, वायर वर्ज़न से स्वतंत्र।
- RFC 9457: Problem Details for HTTP APIsमशीन-रीडेबल API एरर के लिए application/problem+json फ़ॉर्मेट (type, title, status, detail, instance)।
- HTTP response status codes — MDN100 से 511 तक हर स्टेटस कोड, उसका अर्थ और सामान्य उपयोग।
अभ्यास
Online store के Orders API के स्टेटस कोड की समीक्षा
आप एक online grocery store (काल्पनिक) के Orders API को टेस्ट करते हैं। Build 2.6.0 staging environment पर है। नीचे के material में टीम की API conventions हैं, जो स्टेटस कोड के लिए test basis हैं, और आपके test log की ग्यारह रिक्वेस्ट उन रिस्पॉन्स के साथ जो आपको मिले। Mobile app के developer ने आपसे एक सवाल भी पूछा है।
हर रिस्पॉन्स के लिए तय करें कि उसका स्टेटस कोड और हेडर सही हैं या नहीं, और जहाँ नहीं हैं वहाँ expected result लिखें। फिर developer को जवाब दें और वह finding चुनें जिसे आप सबसे पहले रिपोर्ट करेंगे। काग़ज़ और पेन काफ़ी हैं; लगभग 30 मिनट रखें। HTTP स्टेटस कोड लुकअप किसी भी कोड का मतलब बताता है। अगर आप अपने expected results को दोहराने लायक जाँच में बदलना चाहें, तो log का कोई रिस्पॉन्स raw रूप में लिखें और उसे API रिस्पॉन्स वैलिडेटर में पेस्ट करें: यह रिस्पॉन्स को अपेक्षित स्टेटस और उन हेडर से मिलाकर देखता है जो मौजूद होने चाहिए, जैसे Location, WWW-Authenticate या Retry-After।
Online grocery store (काल्पनिक) - Orders API, build 2.6.0 staging environment पर
Base URL: https://staging.grocery.example/api
टीम की API conventions (स्टेटस कोड के लिए test basis)
C1 Create: 201 Created, और Location हेडर जिसमें नए order का URL हो।
C2 Validation: बॉडी parse न हो सके तो 400; parse हो जाए पर कोई value अवैध हो तो 422।
हर एरर की JSON बॉडी होती है: {"error":{"code":"...","message":"..."}}।
C3 Auth: टोकन न हो या expire हो चुका हो तो "WWW-Authenticate: Bearer" के साथ 401;
टोकन वैध हो पर action की अनुमति न हो तो 403।
C4 Privacy: दूसरे ग्राहक के order का जवाब बिल्कुल अनजान order जैसा हो (404)।
C5 State: जिस action की order की मौजूदा state में अनुमति नहीं, उस पर 409।
C6 Rate limit: हर टोकन पर प्रति मिनट 60 रिक्वेस्ट, उसके बाद Retry-After के साथ 429।
C7 Versioning: /v1 paths स्थायी रूप से /v2 पर रीडायरेक्ट होते हैं;
मेथड और बॉडी वही रहते हैं।
C8 फ़ेलियर कभी 200 के साथ नहीं लौटाया जाता।
Test log - जब तक अलग न लिखा हो, ग्राहक A का टोकन; बॉडी छोटी की गई हैं
R1 POST /v2/orders वैध basket, 3 items
-> 200 OK {"id":58213,"status":"PLACED",...} Location हेडर नहीं
R2 POST /v2/orders एक item पर "quantity": 0 (API spec में कम से कम 1 ज़रूरी है)
-> 500 Internal Server Error {"error":{"code":"INTERNAL",...}}
R3 POST /v2/orders 40 bytes के बाद कटी बॉडी (अवैध JSON)
-> 400 Bad Request {"error":{"code":"MALFORMED_JSON",...}}
R4 GET /v2/orders/58213 Authorization हेडर नहीं
-> 403 Forbidden WWW-Authenticate हेडर नहीं
R5 GET /v2/orders/58101 ग्राहक B का order
-> 404 Not Found हेडर और बॉडी वही जो अनजान order 99999999 पर मिलते हैं
R6 POST /v2/orders/58090/cancel order पहले ही shipped है
-> 200 OK {"status":"error","message":"Order already shipped"}
R7 GET /v2/orders?page=2 एक मिनट के भीतर 61वीं रिक्वेस्ट
-> 429 Too Many Requests Retry-After हेडर नहीं
R8 POST /v1/orders वैध basket (ऐप के पुराने versions यही path इस्तेमाल करते हैं)
-> 301 Moved Permanently Location: /api/v2/orders
क्लाइंट आगे GET /v2/orders भेजता है -> 200 OK (orders की list); कोई order नहीं बना
R9 GET /v2/orders/58213 If-None-Match: "a7f3" (ऐप की कैश कॉपी का ETag)
-> 304 Not Modified बॉडी नहीं; कैश होने के बाद order नहीं बदला
R10 GET /v2/orders/58213 14:02 पर, staging पर deployment के दौरान
-> 502 Bad Gateway लोड बैलेंसर का HTML एरर पेज
R11 GET /v2/orders?from=2019-01-01&to=2026-09-30 ग्राहक A की पूरी history
-> 30 सेकंड बाद 504 Gateway Timeout लोड बैलेंसर का HTML एरर पेज
Mobile app के developer का सवाल
"हमारा HTTP क्लाइंट हर 5xx रिस्पॉन्स पर अपने-आप 3 बार तक दोबारा कोशिश करता है।
क्या इन रिक्वेस्ट के लिए यह सुरक्षित है?"- असली रिस्पॉन्स देखने से पहले हर row के लिए लिखें कि conventions कौन-सा स्टेटस कोड और कौन-से हेडर चाहती हैं।
- असली रिस्पॉन्स से तुलना करें और row को सही, defect या टीम के लिए सवाल चिह्नित करें। Defect के लिए वह convention (C1–C8) या गाइड का वह नियम लिखें जो टूटा है।
- R10 और R11 के लिए बताएँ कि gateway का कोड समस्या की जगह के बारे में क्या बताता है, और आप क्या दर्ज करेंगे और क्या दोबारा टेस्ट करेंगे।
- जिस भी रिक्वेस्ट पर 5xx रिस्पॉन्स आया, उसके लिए developer के सवाल का जवाब दें: क्या ऐप उसे अपने-आप दोहरा सकता है, और क्यों? फिर बताएँ कि log का कोई और रिस्पॉन्स दोबारा कोशिश की अनुमति देता है या नहीं, और कब।
- वह finding चुनें जिसे आप सबसे पहले रिपोर्ट करेंगे, उसकी defect report का title लिखें और प्राथमिकता का कारण बताएँ।
मॉडल उत्तर दिखाएँ
सार: स्टेटस कोड या हेडर के छह defects (R1, R2, R4, R6, R7, R8), तीन सही रिस्पॉन्स (R3, R5, R9), और gateway के दो कोड जो सही हैं पर अपने पीछे की समस्या की ओर इशारा करते हैं (R10 जाँच के लिए, R11 एक defect)। नीचे हर row का विवरण है; हर expected result conventions से लिया गया है।
R1 — defect (C1)। Expected result: 201 Created और Location: /api/v2/orders/58213। 200 सिर्फ़ इतना कहता है कि "काम हो गया"; यह नहीं बताता कि नया रिसोर्स बना है, और जो क्लाइंट 201 जाँचता है, या नया order खोलने के लिए Location हेडर पढ़ता है, वह इस रिस्पॉन्स पर भरोसा नहीं कर सकता।
R2 — defect (C2)। बॉडी parse हो जाती है और 0 "कम से कम 1" का नियम तोड़ता है, इसलिए expected result 422 है, ऐसे JSON एरर के साथ जो फ़ील्ड quantity का नाम ले। 500 failure है; उसके पीछे का defect गायब वैलिडेशन है: value ऐसे code तक पहुँच गई जो उसे संभाल नहीं सका, और ख़राब इनपुट का सही जवाब कभी 500 नहीं होता। 0 और 1 इस नियम की दो boundary values हैं, इसलिए जाँचें कि 1 स्वीकार होता है, और -1, 1.5, "two" और गायब quantity भी आज़माएँ, ताकि पता चले कि गायब वैलिडेशन कितनी दूर तक फैला है।
R3 — सही (C2)। जो बॉडी parse ही न हो सके, उस पर JSON एरर बॉडी के साथ 400 आता है। यहाँ 422 गलत होता, क्योंकि वैलिडेट करने के लिए कुछ पढ़ा ही नहीं जा सका।
R4 — defect (C3)। टोकन न होने का मतलब "ऑथेंटिकेटेड नहीं" है: expected result 401 Unauthorized और WWW-Authenticate: Bearer, और RFC 9110 हर 401 पर यह हेडर ज़रूरी बताता है। 403 ऐप से कहता है "आप लॉग इन हैं पर अनुमति नहीं", इसलिए ऐप ग्राहक को sign-in स्क्रीन पर भेजने की जगह permission एरर दिखाता है। Expire हो चुके टोकन से भी दोबारा टेस्ट करें, क्योंकि C3 दोनों हालात कवर करती है, और एक जाँच रखें कि 403 अब भी अपनी सही जगह आता है: वैध टोकन से ऐसा action जिसकी उसे अनुमति नहीं।
R5 — सही (C4)। Order मौजूद है पर ग्राहक B का है। टीम ने 404 चुना ताकि API यह न बताए कि कौन-से order numbers मौजूद हैं, और गाइड 404 का यह इस्तेमाल बताती है (सर्वर बताना नहीं चाहता कि रिसोर्स मौजूद है)। यहाँ 403 आता तो वह C4 के ख़िलाफ़ defect होता, क्योंकि वह पुष्टि कर देता कि order 58101 मौजूद है। असली जाँच तुलना है: स्टेटस, हेडर और बॉडी अनजान order 99999999 के रिस्पॉन्स से बिल्कुल मेल खाने चाहिए, और खाते हैं।
R6 — defect (C5 और C8)। Expected result: JSON एरर बॉडी के साथ 409 Conflict, क्योंकि cancel करना order की मौजूदा state (पहले ही shipped) से टकराता है। "status":"error" के साथ 200 फ़ेलियर को छिपा देता है: ऐप ग्राहक को बता सकता है कि order cancel हो गया, और मॉनिटरिंग इस call को सफलता गिनती है। Side effects भी जाँचें: order अब भी shipped रहना चाहिए और कोई refund शुरू नहीं होना चाहिए।
R7 — defect (C6)। 61वीं रिक्वेस्ट पर 429 सही कोड है, लेकिन C6 जो Retry-After हेडर माँगती है वह गायब है, इसलिए ऐप नहीं जान सकता कि दोबारा कब कोशिश करे: या तो और रिक्वेस्ट भेजता है जिन पर 429 मिलता है, या ज़रूरत से ज़्यादा इंतज़ार करता है। Boundary भी जाँचें: उसी मिनट की 60वीं रिक्वेस्ट सफल होनी चाहिए।
R8 — defect (C7)। Expected result: 308 Permanent Redirect और Location: /api/v2/orders। 301 पर क्लाइंट POST को GET में बदल सकता है (RFC 9110 ऐतिहासिक कारणों से इसकी अनुमति देता है), और ठीक यही हुआ: basket कभी /v2 तक नहीं पहुँचा, कोई order नहीं बना, और chain का आख़िरी रिस्पॉन्स 200 है, इसलिए ऐप सफलता दिखा सकता है। गाइड की सलाह है कि API के लिए 301 की जगह 308 चुनें। पूछें कि ऐप के कौन-से versions अब भी /v1 call करते हैं: इसका जवाब तय करता है कि मामला कितना urgent है।
R9 — सही। 304 एरर नहीं है: ऐप ने ETag "a7f3" के साथ order कैश किया था और तब से वह बदला नहीं, इसलिए सर्वर ने बॉडी नहीं भेजी और ऐप अपनी कैश कॉपी दिखाता है। उल्टा case भी टेस्ट करें: order बदलने के बाद (जैसे cancel होने पर) वही रिक्वेस्ट नई बॉडी और नए ETag के साथ 200 लौटाए; वरना ग्राहक पुराना status देखते रहेंगे।
R10 — स्टेटस कोड में defect नहीं, जाँच के लिए एक सवाल। 502 का मतलब है लोड बैलेंसर को एप्लिकेशन से अवैध रिस्पॉन्स मिला या कोई रिस्पॉन्स नहीं मिला, जो 14:02 के deployment के दौरान एप्लिकेशन सर्वर के रीस्टार्ट होने से मेल खाता है। समय, build और रिक्वेस्ट दर्ज करें, और deployment पूरा होने के बाद दोबारा टेस्ट करें। अगर 502 deployment के बाहर भी आए तो यह एप्लिकेशन के क्रैश होने या कनेक्शन तोड़ने की ओर इशारा करता है: एप्लिकेशन logs के साथ रिपोर्ट करें। टीम के लिए दो सवाल: क्या deployment में रीस्टार्ट से पहले लोड बैलेंसर को उस सर्वर पर रिक्वेस्ट भेजना बंद कर देना चाहिए, ताकि क्लाइंट को 502 दिखे ही नहीं? और क्या ऐप उस HTML एरर पेज को संभाल पाता है जहाँ C2 JSON बॉडी का वादा करती है?
R11 — 504 ख़ुद सही है: लोड बैलेंसर ने 30 सेकंड इंतज़ार किया और एप्लिकेशन ने समय पर जवाब नहीं दिया। Defect उसके पीछे है: लंबी history (2019 से 2026) पर search उन 30 सेकंड में पूरी नहीं होती जो gateway देता है। Date range छोटी करके पता करें कि लगभग कहाँ से failure शुरू होता है, response times दर्ज करें, और इसे performance defect के रूप में रिपोर्ट करें। Product owner से पूछें कि क्या date range की कोई अधिकतम सीमा है: अगर है, तो जिस range को API serve नहीं करेगा उसे timeout की जगह 422 (C2) से reject होना चाहिए। वही रिक्वेस्ट दोहराने से कुछ नहीं बदलेगा।
Developer का सवाल: अभी जैसा है, वैसा सुरक्षित नहीं। अपने-आप दोबारा कोशिश तभी करें जब दोनों बातें सच हों: कोड अस्थायी हो (502, 503, 504) और मेथड idempotent हो (GET, PUT, DELETE)। R2 को दो वजहों से नहीं दोहराना चाहिए। उसका 500 रिक्वेस्ट की वजह से आया है, इसलिए हर बार वही लौटता है। और POST idempotent नहीं है, जो बड़ा जोखिम है: अगर POST /v2/orders पर 502 या 504 आए तो हो सकता है रिस्पॉन्स खोने से पहले सर्वर order बना चुका हो, और अपने-आप दोहराने से दूसरा order बन सकता है। फ़ेल हुए POST के बाद ऐप दोबारा भेजने का विकल्प देने से पहले GET से orders की list जाँचे, और developers बताएँ कि API duplicate orders को कैसे रोकता है। R10 दोहराना सुरक्षित है (GET, अस्थायी कोड, बैकऑफ़ के साथ)। R11 भी GET है, लेकिन बहुत भारी रिक्वेस्ट दोहराने से सिर्फ़ load बढ़ता है और वह फिर timeout होती है, इसलिए कोशिशों की गिनती कम रखें और बैकऑफ़ इस्तेमाल करें। आख़िर में, 429 एक 4xx है जिसे दोहराया जा सकता है, पर सिर्फ़ Retry-After के समय के बाद, और यह R7 के अहम होने की एक और वजह है।
सबसे पहले R8 रिपोर्ट करें। Title का उदाहरण: "POST /v1/orders 308 की जगह 301 लौटाता है; क्लाइंट उसे GET के रूप में दोबारा भेजता है और कोई order नहीं बनता"। यह पहले इसलिए है कि जो भी ऐप अब भी /v1 call करता है, उसके ग्राहक बिना किसी एरर मैसेज के अपने orders खो देते हैं, और chain 200 पर ख़त्म होती है। फिर R6 (फ़ेल हुआ cancellation सफलता के रूप में दिखता है) और R4 (टोकन न होना permission की समस्या के रूप में दिखता है, इसलिए ऐप ग्राहक को sign-in पर नहीं भेजता)। अगर आपने R6 को पहले रखा क्योंकि आप जानते हैं कि सभी ऐप /v2 पर आ चुके हैं, तो यह ठीक कारण है; अहम यह है कि प्राथमिकता ग्राहकों पर असर से तय हो। Fixes के बाद यही rows confirmation testing के रूप में दोबारा चलाएँ।
अपना काम जाँचने के लिए: हर row के लिए अपेक्षित कोड होना चाहिए, और जहाँ conventions माँगती हैं वहाँ हेडर भी (Location, WWW-Authenticate, Retry-After)। अगर आपने R3, R5 या R9 को defect माना, तो गाइड में फिर पढ़ें कि वह 400 बनाम 422 के बारे में, 404 के बारे में (सर्वर शायद न बताना चाहे कि रिसोर्स मौजूद है) और 304 के बारे में (एरर नहीं) क्या कहती है।
इस topic में आपकी प्रगति
प्रगति ट्रैक करने के लिए साइन इन करें
Topics पूर्ण चिह्नित करें, जहाँ छोड़ा था वहीं से जारी रखें और specialisation परीक्षाएँ खोलें।
QA रोडमैप का हिस्सा
इस topic से पहले
इस गाइड में बताए गए टूल्स
किसी भी HTTP स्टेटस कोड का अर्थ, RFC संदर्भ और उसे कब इस्तेमाल करना है — सब एक जगह देखें।
किसी रिस्पॉन्स का HTTP स्टेटस कोड और हेडर जाँचें और जानें कि वह उस स्थिति के लिए सही है या नहीं।
ऐसा सार्वजनिक endpoint पाएँ जो कोई भी HTTP स्टेटस कोड लौटाए, वैकल्पिक देरी और कस्टम JSON बॉडी के साथ, ताकि क्लाइंट की error हैंडलिंग टेस्ट हो सके।
रीडायरेक्ट चेन (301/302/307/308) ट्रेस करें और हर हॉप, स्टेटस तथा अंतिम URL देखें।
HTTP रिक्वेस्ट (method, URL, हेडर, auth, बॉडी) बनाएँ और भेजें, फिर रिस्पॉन्स जाँचें — आपके ब्राउज़र में हल्का-फुल्का Postman।
किसी भी HTTP स्टेटस कोड के लिए उपयुक्त हेडर और बॉडी वाले उदाहरण रिस्पॉन्स बनाएँ।
CORS कॉन्फ़िगरेशन जाँचें: किसी origin से preflight और सामान्य रिक्वेस्ट भेजकर Access-Control-* हेडर देखें।