REST API की बुनियादी बातें

REST (Representational State Transfer) एक architectural style है, जिसे Roy Fielding ने 2000 में अपने doctoral dissertation में बताया: constraints का एक set, कोई protocol या standard नहीं। REST API resources दिखाता है — कोई order, customer या task — और हर एक की पहचान एक URI से होती है। Clients standard HTTP methods से उन पर काम करते हैं और उनके representations का आदान-प्रदान करते हैं, आमतौर पर JSON में।

उदाहरण: एक to-do API collection /tasks दिखाता है और हर task अपने URI पर, जैसे /tasks/42। GET /tasks/42 task 42 लौटाता है, {"done": true} के साथ PATCH /tasks/42 एक field बदलता है, और DELETE /tasks/42 उसे हटा देता है। URI चीज़ का नाम बताता है, method बताता है कि उसके साथ क्या करना है, और status code बताता है कि नतीजा क्या रहा।

यह क्यों ज़रूरी है

REST conventions से आप request भेजने से पहले ही expected behaviour का अनुमान लगा सकते हैं: create 201 Created लौटाता है, delete हुआ resource फिर नहीं मिलता, unsupported method 405 से reject होता है। जहाँ भी API बिना document किए कोई convention तोड़ता है, वहाँ client developers ऐसा code लिख सकते हैं जो उसे गलत handle करे।

API defect की कीमत उसके clients की संख्या से गुणा हो जाती है। Rename हुआ field या ख़राब input पर 500 web front end, partner integration और users के phones पर पहले से installed app versions को तोड़ सकता है, जबकि उनमें से किसी में कोई बदलाव नहीं हुआ। Conventions जानना "API कुछ अजीब लग रहा है" को test cases के लिए सटीक expectations में बदल देता है।

Resources, URIs, representations और statelessness

Fielding REST को छह constraints से परिभाषित करते हैं (जिनमें से एक optional है), जिनमें statelessness और uniform interface शामिल हैं। REST कहलाने वाले APIs अक्सर इन्हें आंशिक रूप से ही लागू करते हैं — client आगे क्या कर सकता है, यह बताने वाले hypermedia links अक्सर छोड़ दिए जाते हैं — इसलिए API को पहले उसके अपने contract से परखें और inconsistencies पकड़ने के लिए REST conventions इस्तेमाल करें। Testing के लिए चार ideas सबसे अहम हैं:

  • Resource: API जो भी नाम वाली चीज़ दिखाता है — एक task, एक user, tasks की list। Resources संज्ञाएँ (nouns) हैं और action method से आता है: POST /tasks, न कि POST /createTask।
  • URI: resource की पहचान, जिसका syntax RFC 3986 में परिभाषित है। एक आम convention है plural collection /tasks, उसके members /tasks/42 और sub-resources /tasks/42/comments।
  • Representation: किसी ठोस format में resource की state। Client जो format भेजता है वह Content-Type में और जो formats पढ़ सकता है वे Accept में बताता है।
  • Statelessness: हर request में वह सब होता है जो server को उसे समझने के लिए चाहिए — token जैसे credentials, identifiers, page number। Server पिछली requests का कोई session context नहीं रखता (stored resources ज़ाहिर है बने रहते हैं), इसलिए request दोहराई जाए, अकेले भेजी जाए या किसी दूसरे server पर handle हो, उसका मतलब वही रहता है। इसे ऐसे ही टेस्ट करें: pages 1 और 2 लाए बिना सीधे page 3 माँगें।

Methods की CRUD से mapping

CRUD — create, read, update, delete — stored data पर बुनियादी operations का नाम है। REST में हर operation एक HTTP method है जो collection पर या किसी एक item पर लगता है। Methods और उनकी safe व idempotent properties आप HTTP methods वाले lesson में देख चुके हैं; table उन्हें resources के साथ जोड़ती है।

Table के पीछे का pattern: create collection पर होता है और नए item का URI server चुनता है; read पूरे collection का या एक item का होता है; update और delete एक item पर, उसके अपने URI पर होते हैं। Table से बाहर के combinations — POST /tasks/42, या पूरे collection पर PUT, PATCH और DELETE — आमतौर पर उपलब्ध नहीं होते और उन्हें 405 Method Not Allowed मिलना चाहिए।

Tasks API में हर CRUD operation collection या एक item पर एक method है; बाकी हर combination 405 और Allow header के साथ reject होना चाहिए।
MethodResource
/taskscollection/tasks/{id}एक item
GETReadTasks की list200 OK, अक्सर pages मेंएक task पढ़ना200 OK · मौजूद न हो तो 404
POSTCreateTask बनाना; id server चुनता है201 Created + Locationआमतौर पर उपलब्ध नहीं405 + Allow
PUTUpdate: replaceआमतौर पर उपलब्ध नहीं405 + Allowपूरा task बदलना200 या 204 · task बना तो 201
PATCHUpdate: कुछ fieldsआमतौर पर उपलब्ध नहीं405 + Allowसिर्फ़ भेजे गए fields बदलना200 या 204
DELETEDeleteआमतौर पर उपलब्ध नहीं405 + AllowTask delete करना204 (या 200, 202) · फिर GET से 404
  • CRUD operation और उसका आम success code
  • उपलब्ध नहीं: Allow header के साथ 405 Method Not Allowed की उम्मीद करें

यह एक आम design है: कौन-से combinations मौजूद हैं, यह API का अपना contract तय करता है।

पाठ संस्करण
Operation  Method  URI          Typical success response
---------  ------  -----------  ---------------------------------------------
Create     POST    /tasks       201 Created + Location: /tasks/{id}
Read       GET     /tasks       200 OK, a list (often paged)
Read       GET     /tasks/{id}  200 OK, one task
Update     PUT     /tasks/{id}  200 OK or 204 No Content, whole task replaced
Update     PATCH   /tasks/{id}  200 OK or 204 No Content, sent fields only
Delete     DELETE  /tasks/{id}  204 No Content (200 with a body, 202 if queued)

REST API में status codes

Clients body पढ़ने से पहले status code के आधार पर आगे का रास्ता चुनते हैं, इसलिए code contract का हिस्सा है। REST में code operation और resource की state से तय होता है, इसलिए हर test case expected code बता सकता है।

  • Create के बाद 201 Created, Location header के साथ जिसमें नया URI हो (RFC 9110)। सिर्फ़ body में id के साथ 200 एक आम विचलन है; यह defect है या नहीं, contract तय करता है।
  • 204 No Content उस सफल update या delete के लिए जो कुछ नहीं लौटाता: body खाली होनी चाहिए।
  • 404 Not Found गायब item के लिए, अभी-अभी delete हुआ item भी। खाली list खाली array के साथ 200 है।
  • 405 Method Not Allowed ऐसे method के लिए जिसे resource support नहीं करता, Allow header के साथ जिसमें supported methods हों; RFC 9110 यह header ज़रूरी करता है।
  • 415 Unsupported Media Type ऐसे body format के लिए जिसे resource स्वीकार नहीं करता; 406 Not Acceptable जब server Accept में दिया कोई भी format न बना सके — RFC 9110 उसे इसकी जगह अपना default format भेजने की छूट भी देता है।
  • 409 Conflict जब request मौजूदा state से टकराए, जैसे पहले से registered e-mail; invalid input के लिए 400 या 422, एक जैसे इस्तेमाल के साथ।
  • Client की गलती पर कभी 5xx नहीं: ख़राब input पर 500 का मतलब आमतौर पर यह है कि input validation या error handling गायब है।

आज़माएँ: HTTP स्टेटस एनालाइज़र आज़माएँ: HTTP स्टेटस कोड लुकअप

Worked example: एक task का पूरा lifecycle

Tester एक task को हर operation से गुज़ारता है और हर step के बाद status code और stored state assert करता है। Test account में शुरू में कोई task नहीं है।

  • बाद के steps अंदाज़े वाले URI की बजाय Location header से मिला /v1/tasks/57 इस्तेमाल करते हैं।
  • POST collection का method है: item /v1/tasks/57 पर उसे 405 मिलता है, और Allow बताता है कि item असल में कौन-से methods support करता है।
  • DELETE के बाद item नहीं रहता, इसलिए GET /v1/tasks/57 404 लौटाता है; collection अब भी मौजूद है, इसलिए GET /v1/tasks खाली array के साथ 200 लौटाता है, 404 नहीं।
  • हर method यहाँ भी अपने वादे निभाता है — PATCH सिर्फ़ भेजे गए fields बदलता है, PUT पूरी state लेकर आता है, और दोहराया गया DELETE 404 लौटाकर भी idempotent रहता है — जैसा HTTP methods वाले lesson के safe और idempotent methods तथा हर method में क्या टेस्ट करें वाले sections समझाते हैं।
POST /v1/tasks  {"title": "Pay rent", "done": false}
  -> 201 Created, Location: /v1/tasks/57
GET /v1/tasks/57
  -> 200 OK, {"id": 57, "title": "Pay rent", "done": false}
PATCH /v1/tasks/57  {"done": true}
  -> 200 OK, {"id": 57, "title": "Pay rent", "done": true}
POST /v1/tasks/57
  -> 405 Method Not Allowed, Allow: GET, HEAD, PUT, PATCH, DELETE
DELETE /v1/tasks/57
  -> 204 No Content
GET /v1/tasks/57
  -> 404 Not Found
GET /v1/tasks
  -> 200 OK, []

आज़माएँ: REST API टेस्टर आज़माएँ: API रिक्वेस्ट बिल्डर

Versioning और breaking changes

API के ऐसे clients होते हैं जिन पर उसकी team का नियंत्रण नहीं, इसलिए उसे मनमर्ज़ी से नहीं बदला जा सकता। Breaking change वह है जो एक सही, बिना बदले client को fail कर दे: field हटाना या rename करना, उसका type बदलना, request के optional field को required बनाना, या URI या status code बदलना। नया endpoint या optional field जोड़ना आमतौर पर सुरक्षित है, बशर्ते clients अनजान fields को ignore करें।

REST कोई versioning scheme तय नहीं करता। Teams एक scheme चुनती हैं और उसे contract में, अक्सर OpenAPI document में, लिखती हैं: URI path (/v1/tasks), query parameter (?version=2), Api-Version: 2 जैसा custom request header (नाम हर API में अलग हो सकता है) या media type (Accept: application/vnd.example.v2+json)।

  • नया version ship होने के बाद पुराने version के regression tests बिना बदले चलाएँ: v1 को अब भी अपने contract के मुताबिक़ व्यवहार करना चाहिए।
  • एक ही request दोनों versions को भेजें और पक्का करें कि सिर्फ़ documented अंतर ही दिखें।
  • बिना version, अनजान version और retired version वाली requests भेजें: documented default या साफ़ 4xx की उम्मीद करें, कभी 500 नहीं।

आज़माएँ: API रिस्पॉन्स कम्पेरेटर आज़माएँ: OpenAPI व्यूअर

आम गलतियाँ

  • REST को तय नियमों वाला standard मान लेना। यह एक architectural style है; details API का contract तय करता है।
  • Requests को सिर्फ़ उसी क्रम में टेस्ट करना जिसमें user interface उन्हें भेजता है। REST request stateless होती है, इसलिए उसे अकेले भी भेजें: pages 1 और 2 के बिना page 3, list load किए बिना item उसके URI से।
  • किसी भी 2xx को pass मान लेना, जबकि clients exact code पर निर्भर हैं, जैसे Location के साथ 201।
  • खाली list पर 404 की उम्मीद करना। Collection अब भी मौजूद है, इसलिए सही जवाब खाली array के साथ 200 है; 404 गायब item के लिए है।
  • Release के बाद सिर्फ़ नया version टेस्ट करना और v1 में घुस आया बदलाव miss कर देना।

QA का नज़रिया

REST की समझ code चलने से पहले ही काम आती है। नए या बदले contract को requirement की तरह review करें: हर resource के लिए कौन-से methods हैं, हर एक कौन-सा status code लौटाता है, duplicate या गायब item पर क्या होता है, और क्या कोई बदलाव breaking है। जवाब developers और API इस्तेमाल करने वाली teams — web, mobile, partners — के साथ तय करें।

हर test case में expected status code और मुख्य headers लिखें और हर resource के लिए एक lifecycle test रखें। Bug report में method, URI, request body, expected और actual status दें, ताकि developer call सेकंडों में replay कर सके।

अभ्यास

Clinic booking API का transcript review करें

आपका काम

आप staging पर एक clinic booking API के appointments resource को टेस्ट कर रहे हैं। Contract /v1/appointments और /v1/appointments/{id} परिभाषित करता है, create के लिए Location header के साथ 201 Created और list पर date filter document करता है, और गायब items के लिए 404 लौटाता है। हर line के लिए तय करें कि observed response सही है या नहीं; हर गलत response के लिए expected response और कारण लिखें।

सामग्री
#  Request                                            Observed response
1  POST   /v1/appointments  (valid JSON body)         200 OK, body has "id": 381,
                                                      no Location header
2  GET    /v1/appointments?date=2026-11-02            404 Not Found,
                                                      no appointments on that date
3  POST   /v1/appointments/381                        404 Not Found
4  POST   /v1/appointments  Content-Type: text/plain  500 Internal Server Error
5  DELETE /v1/appointments/381                        204 No Content
6  GET    /v1/appointments/381                        404 Not Found
7  DELETE /v1/appointments/381                        500 Internal Server Error
8  GET    /v1/appointments/377  (after v2 release)    "time" is now named "startsAt"
चरण
  1. Method, URI और उस पल resource की state से expected status code (और ज़रूरी हो तो header) लिखें।
  2. उसकी observed response से तुलना करें और line को pass या defect चिह्नित करें।
  3. Clients और users पर असर के हिसाब से defects का क्रम तय करें।
मॉडल उत्तर दिखाएँ
मॉडल उत्तर

सही: lines 5 और 6। DELETE के बाद 404 ठीक वही है जो होना चाहिए।

Line 1: expected Location: /v1/appointments/381 के साथ 201 Created, जैसा contract document करता है। जो clients नया URI Location से पढ़ते हैं, वे आगे नहीं बढ़ पाते।

Line 2: कोई appointment filter से मेल न खाए तब भी collection मौजूद है, इसलिए expected खाली array के साथ 200 OK है। 404 clients को बताता है कि list ही मौजूद नहीं है, और कई clients खाली दिन की जगह error दिखाएँगे।

Line 3: POST collection /v1/appointments का method है, item का नहीं, और appointment 381 मौजूद है, इसलिए 404 गुमराह करता है; expected है 405 Method Not Allowed, item के supported methods बताने वाले Allow header के साथ।

Line 4: unsupported body format client की गलती है; expected 415 Unsupported Media Type है, server crash नहीं।

Line 7: appointment पहले ही delete हो चुका है, इसलिए expected 404 है, जैसा contract गायब items के लिए कहता है। 500 एक unhandled case है; GET से पक्का करें कि state नहीं बदली।

Line 8: एक breaking change v1 में घुस आया। Rename सिर्फ़ v2 में होना चाहिए।

पहले उठाएँ: line 8 (मौजूदा clients टूटते हैं); फिर lines 4 और 7 (जहाँ 4xx चाहिए वहाँ 500); फिर lines 1, 2 और 3 (गुमराह करने वाले codes)।

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

क्या REST और HTTP एक ही हैं?

नहीं। HTTP एक protocol है, जिसे RFC 9110 जैसे IETF standards परिभाषित करते हैं। REST एक architectural style है। REST APIs आमतौर पर HTTP इस्तेमाल करते हैं, लेकिन कोई HTTP API REST को पूरी तरह नज़रअंदाज़ कर सकता है, जैसे हर action को एक ही URL पर POST के रूप में भेजना।

Create को 200 लौटाना चाहिए या 201?

RFC 9110 कहता है कि जब POST कोई resource बनाता है, तो server को उसे पहचानने वाले Location header के साथ 201 Created भेजना चाहिए। कुछ APIs body में नए id के साथ 200 लौटाते हैं; यह तभी चलता है जब contract ऐसा कहे और हर client यही उम्मीद करे। Contract के हिसाब से टेस्ट करें, और जब एक ही API के endpoints इसे अलग-अलग तरह से करें तो मुद्दा उठाएँ।

REST API लंबी list को pages में कैसे बाँटता है?

REST कोई scheme तय नहीं करता, इसलिए contract को इसे बताना चाहिए। आम designs हैं page या offset parameters (?page=3&size=20) और एक opaque cursor, जिसे हर response अगली request के लिए लौटाता है; कुछ APIs अगले page का URI भी लौटाते हैं, body में या Link header में। पहला और आख़िरी page, आख़िरी के बाद वाला page (खाली array के साथ 200, या documented 4xx), सबसे बड़ा allowed page size और उससे एक ज़्यादा टेस्ट करें, और पक्का करें कि requests के बीच items जुड़ने पर कोई item न छूटे और न दोहराया जाए, जो offset paging की जानी-पहचानी कमज़ोरी है।

कौन-सी versioning scheme सबसे अच्छी है?

इसका कोई standard जवाब नहीं। URI path में version देखना, route करना और टेस्ट करना आसान है; header और media-type versioning URIs को स्थिर रखती हैं। Testing के लिए ज़रूरी यह है कि scheme documented हो, हर endpoint पर एक जैसी लागू हो, और पुराने versions अपनी घोषित retirement तक काम करते रहें।

संदर्भ

  • RFC 9110: HTTP SemanticsIETF · 2022HTTP मेथड, हेडर फ़ील्ड, स्टेटस कोड और कंटेंट निगोशिएशन के अर्थ, वायर वर्ज़न से स्वतंत्र।
  • RFC 3986: Uniform Resource Identifier (URI): Generic SyntaxIETF · 2005URI के भाग (स्कीम, अथॉरिटी, पाथ, क्वेरी, फ़्रैगमेंट), रिज़र्व्ड कैरेक्टर और परसेंट-एन्कोडिंग।
  • RFC 5789: PATCH Method for HTTPIETF · 2010आंशिक अपडेट के लिए PATCH मेथड, जबकि PUT पूरे रिसोर्स को बदल देता है।
  • OpenAPI SpecificationOpenAPI InitiativeREST API के वर्णन का मानक: पाथ, ऑपरेशन, पैरामीटर, स्कीमा, रिस्पॉन्स और सिक्योरिटी स्कीम।

Mutqan tools से अभ्यास करें

method, हेडर और JSON बॉडी पर पूरे नियंत्रण के साथ REST endpoint टेस्ट करें, फिर स्टेटस, हेडर और JSON path पर assertion लगाएँ।

API टेस्टिंग

HTTP रिक्वेस्ट (method, URL, हेडर, auth, बॉडी) बनाएँ और भेजें, फिर रिस्पॉन्स जाँचें — आपके ब्राउज़र में हल्का-फुल्का Postman।

API टेस्टिंग

किसी रिस्पॉन्स का HTTP स्टेटस कोड और हेडर जाँचें और जानें कि वह उस स्थिति के लिए सही है या नहीं।

वैलिडेशन

किसी भी HTTP स्टेटस कोड का अर्थ, RFC संदर्भ और उसे कब इस्तेमाल करना है — सब एक जगह देखें।

वेब

दो API रिस्पॉन्स (जैसे staging बनाम production) की तुलना करें और हर संरचनात्मक तथा वैल्यू का अंतर देखें।

API टेस्टिंग

OpenAPI 3.x / Swagger 2.0 स्पेक (JSON या YAML) को ब्राउज़ करने लायक़ endpoint दस्तावेज़ों के रूप में दिखाएँ।

वेब

और गहराई से

इस topic में आपकी प्रगति

QA रोडमैप का हिस्सा