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 मिलना चाहिए।
| Method | Resource | |
|---|---|---|
/taskscollection | /tasks/{id}एक item | |
GETRead | Tasks की list200 OK, अक्सर pages में | एक task पढ़ना200 OK · मौजूद न हो तो 404 |
POSTCreate | Task बनाना; 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 + Allow | Task delete करना204 (या 200, 202) · फिर GET से 404 |
- CRUD operation और उसका आम success code
- उपलब्ध नहीं:
Allowheader के साथ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,Locationheader के साथ जिसमें नया 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 नहीं करता,Allowheader के साथ जिसमें supported methods हों; RFC 9110 यह header ज़रूरी करता है।415 Unsupported Media Typeऐसे body format के लिए जिसे resource स्वीकार नहीं करता;406 Not Acceptableजब serverAcceptमें दिया कोई भी 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 की बजाय
Locationheader से मिला/v1/tasks/57इस्तेमाल करते हैं। - POST collection का method है: item
/v1/tasks/57पर उसे405मिलता है, औरAllowबताता है कि item असल में कौन-से methods support करता है। - DELETE के बाद item नहीं रहता, इसलिए
GET /v1/tasks/57404लौटाता है; 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, []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नहीं।
आम गलतियाँ
- 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"- Method, URI और उस पल resource की state से expected status code (और ज़रूरी हो तो header) लिखें।
- उसकी observed response से तुलना करें और line को pass या defect चिह्नित करें।
- 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 SemanticsHTTP मेथड, हेडर फ़ील्ड, स्टेटस कोड और कंटेंट निगोशिएशन के अर्थ, वायर वर्ज़न से स्वतंत्र।
- RFC 3986: Uniform Resource Identifier (URI): Generic SyntaxURI के भाग (स्कीम, अथॉरिटी, पाथ, क्वेरी, फ़्रैगमेंट), रिज़र्व्ड कैरेक्टर और परसेंट-एन्कोडिंग।
- RFC 5789: PATCH Method for HTTPआंशिक अपडेट के लिए PATCH मेथड, जबकि PUT पूरे रिसोर्स को बदल देता है।
- OpenAPI SpecificationREST API के वर्णन का मानक: पाथ, ऑपरेशन, पैरामीटर, स्कीमा, रिस्पॉन्स और सिक्योरिटी स्कीम।
Mutqan tools से अभ्यास करें
method, हेडर और JSON बॉडी पर पूरे नियंत्रण के साथ REST endpoint टेस्ट करें, फिर स्टेटस, हेडर और JSON path पर assertion लगाएँ।
HTTP रिक्वेस्ट (method, URL, हेडर, auth, बॉडी) बनाएँ और भेजें, फिर रिस्पॉन्स जाँचें — आपके ब्राउज़र में हल्का-फुल्का Postman।
किसी रिस्पॉन्स का HTTP स्टेटस कोड और हेडर जाँचें और जानें कि वह उस स्थिति के लिए सही है या नहीं।
किसी भी HTTP स्टेटस कोड का अर्थ, RFC संदर्भ और उसे कब इस्तेमाल करना है — सब एक जगह देखें।
दो API रिस्पॉन्स (जैसे staging बनाम production) की तुलना करें और हर संरचनात्मक तथा वैल्यू का अंतर देखें।
OpenAPI 3.x / Swagger 2.0 स्पेक (JSON या YAML) को ब्राउज़ करने लायक़ endpoint दस्तावेज़ों के रूप में दिखाएँ।
और गहराई से
इस topic में आपकी प्रगति
प्रगति ट्रैक करने के लिए साइन इन करें
Topics पूर्ण चिह्नित करें, जहाँ छोड़ा था वहीं से जारी रखें और specialisation परीक्षाएँ खोलें।