13 · 🔧 प्रत्येक REST method — सात शिक्के
भाग 3 — संपूर्ण नकाशे. धडे 13–16 हे संदर्भ धडे आहेत: या कोर्सने धडे 01–12 मध्ये बांधलेल्या एका काउंटरपलीकडे कामातल्या अभियंत्याला भेटणारे सगळे. प्रत्येकाचा site वर पूर्ण काढलेला नकाशा आणि या repo मध्ये चालवता येणारा code आहे.
📦 या ब्रँचमध्ये काय आहे
धडे 01–13. काउंटर आता सातही REST methods ना उत्तर देतो:
- api/school_api.py —
do_PATCH(merge + validate),do_HEAD(फक्त headers),do_OPTIONS(Allow यादी आणि CORS preflight) - api/methods_demo.sh — काउंटरवर प्रत्येक method, प्रत्येक नियम सिद्ध करणाऱ्या headers सह
- api/methods-output.txt — निरोगी run काय छापतो
- 🗺️ संपूर्ण नकाशा: https://school-edh.pages.dev/api/lesson-diagrams.html#l13 — प्रत्येक method चे चित्र, तक्ता, प्रत्येक method चे status codes, PUT विरुद्ध PATCH विरुद्ध POST, चुका
🧒 5 वर्षांच्या मुलाला समजावल्यासारखे
काउंटरकडे सात शिक्के आहेत. त्यातले तीन फक्त कपाटाकडे पाहतात — 📖 GET file वाचतो, 👀 HEAD file न उघडता ती आहे का ते पाहतो, ❓ OPTIONS विचारतो "मी इथे काय करू शकतो?". चार शिक्के कपाट बदलतात — ➕ POST नवीन form file करतो (आणि त्याला नंबर देतो), 🔁 PUT एक file पूर्ण नवीन file ने बदलतो, ✏️ PATCH file मधली एक ओळ बदलतो, 🗑️ DELETE file बाहेर काढतो.
तीन शब्द शिक्क्यांना वेगळे करतात. Safe: ते काही बदलते का? Idempotent: मी ते दोनदा केले तर कपाट एकदा केल्यासारखेच राहते का? Cacheable: उत्तर जपून पुन्हा वापरता येते का? तुमच्या आणि काउंटरमधले संपूर्ण internet — browsers, CDNs, proxies, retry libraries — या तीन वचनांवर विश्वास ठेवते. एक मोडले की तुम्ही सगळे एकदम मोडता.
🗺️ आकृती
flowchart LR
subgraph safe["SAFE · changes nothing · cacheable"]
G[GET — read it] ; H[HEAD — headers only] ; O[OPTIONS — what may I do?]
end
subgraph unsafe["UNSAFE · needs the hall pass"]
P[POST — file a NEW one<br/>not idempotent] ; U[PUT — replace the whole thing<br/>idempotent] ; PA[PATCH — change part of it<br/>idempotent for merge-patch] ; D[DELETE — remove it<br/>idempotent by state]
end
C((the counter)) --> safe --> C
C --> unsafe --> C
❓ काय
| Method | काय करते | Safe | Idempotent | Body आत | Cacheable | यशस्वी उत्तर |
|---|---|---|---|---|---|---|
| GET | एक resource किंवा यादी वाचते | ✅ | ✅ | ❌ (query string) | ✅ | 200 · 304 |
| HEAD | GET चे फक्त headers | ✅ | ✅ | ❌ | ✅ | 200 · 304 |
| OPTIONS | परवानगी असलेले methods · CORS preflight | ✅ | ✅ | ❌ | ✅ (Max-Age) | 204 · 200 |
| POST | तयार करते · किंवा एखादी क्रिया करते | ❌ | ❌ Idempotency-Key नसेल तर | ✅ | ❌ | 201 + Location · 200 · 202 |
| PUT | पूर्ण resource बदलते | ❌ | ✅ | ✅ सगळे fields | ❌ | 200 · 204 |
| PATCH | resource चा एक भाग बदलते | ❌ | ✅ merge-patch साठी | ✅ फक्त बदल | ❌ | 200 · 204 |
| DELETE | resource काढून टाकते | ❌ | ✅ स्थितीनुसार | ❌ | ❌ | 204 · 202 |
TRACE आणि CONNECT RFC मध्ये आहेत; काउंटर ते जवळजवळ कधीच लागू करत नाही.
🤔 का
प्रत्येक मध्यस्थ या तीन शब्दांवर विश्वास ठेवतो. Delete करणारा GET एखादा crawler चालवून टाकतो. वाचण्यासाठी वापरलेला POST cache होऊ शकत नाही. Idempotent नसलेला PUT निरुपद्रवी retry ला बिघडलेल्या data मध्ये बदलतो. Method निवडणे म्हणजेच तुमच्या आणि तुमच्या client मधल्या प्रत्येक गोष्टीला कोणती वचने द्यायची ते निवडणे.
🔧 कसे (या repo मध्ये)
do_PATCHbody साठवलेल्या student मध्ये merge करतो, merge झालेला निकाल validate करतो, आणि अनोळखी fields 400 ने नाकारतो — गुपचूप दुर्लक्ष कधीच नाही.do_HEADhead_onlyलावतो आणिdo_GETला बोलावतो;send()headers लिहितो आणि body वगळतो, त्यामुळेContent-LengthआणिETagनेमके GET पाठवेल तेच असतात.do_OPTIONSAllowआणिAccess-Control-*headers सह 204 उत्तर देतो, जे browser cross-origin PUT, PATCH किंवा DELETE आधी विचारतो (UI शाळा, धडा 11).
🧪 करून पाहा
python3 api/school_api.py &
bash api/methods_demo.sh
# then by hand:
curl -I http://127.0.0.1:8080/v1/students/2 # HEAD: headers, no body
curl -i -X OPTIONS http://127.0.0.1:8080/v1/students/2 | grep -i allow # what may I do here?
curl -X PATCH http://127.0.0.1:8080/v1/students/2 -H 'X-API-Key: hall-pass-123' \
-H 'Content-Type: application/json' -d '{"grade":"A"}' # one field only
✅ तपासा — तुम्हाला काय दिसायला हवे
methods_demo.sh प्रत्येक method साठी एक block छापतो: GET आणि HEAD वर तोच ETag,
OPTIONS वर Allow यादी, दोन POSTs मधून दोन Location headers, दोन PUTs मधून एक
student, एकाच field च्या PUT साठी problems सह 400, PATCH मधून merge झालेला student,
अनोळखी PATCH field साठी 400, आणि DELETE, DELETE, GET साठी 204 204 404.
पूर्ण मजकूर api/methods-output.txt मध्ये आहे.
🏁 तुम्ही आत्ताच काय सिद्ध केले
तुम्ही तीन शब्द तारेवर पाहिले: safe methods नी हॉल पासशिवाय उत्तर दिले, idempotent methods नी दोनदा तीच स्थिती दिली, आणि एकमेव non-idempotent method (POST) ने जुळे तयार केले — म्हणूनच धडा 07 ने Idempotency-Key जोडली.
⚠️ नेहमीच्या चुका
- URL मध्ये क्रियापद (
GET /students/5/delete): आधीच आणणारा (prefetch) browser data delete करतो. - "बाकीचे तसेच ठेवणारा" अर्धवट body असलेला PUT: एका client चे सुटलेले field दुसऱ्याचा data रिकामा करते.
- अनोळखी fields कडे दुर्लक्ष करणारा PATCH:
grdaeमधली टायपो 200 देते आणि काहीच save करत नाही. Locationheader शिवाय 201; error साठी आत{"ok": false}असलेला 200.- OPTIONS विसरणे: सूचना फलकावरून होणारे प्रत्येक cross-origin write CORS error ने fail होते.
🏭 प्रत्यक्ष वापरात हे का महत्त्वाचे: retry libraries idempotent methods आपोआप retry करतात आणि POST कधीच retry करत नाहीत; CDNs फक्त GET आणि HEAD cache करतात, दुसरे काहीच नाही; browsers OPTIONS ने preflight करतात. Method बरोबर निवडा आणि तिघेही आपोआप योग्य वागतात. चुकीची निवडा आणि रात्री 2 वाजता deletion serve करणाऱ्या cache चा debug करत बसाल.
⏭️ पुढे
धडा 14 — प्रत्येक authentication पद्धत: काउंटरकडे एकाच प्रकारचा हॉल पास आहे; जगात नऊ आहेत.