# HTTP Methods और उनकी गारंटियाँ — API Design और Versioning

Source: https://www.geekswithgeeks.com/hi/api-design/pr-http-methods

> GET, POST, PUT, PATCH और DELETE को उनकी safety और idempotency semantics के अनुसार उपयोग करें।

## Safe और idempotent

**Safe** methods सर्वर की स्थिति नहीं बदलते (`GET`, `HEAD`, `OPTIONS`), इसलिए clients, caches और crawlers उन्हें खुलकर बुला सकते हैं। **Idempotent** methods दोहराने पर वही अंतिम स्थिति देते हैं (`GET`, `PUT`, `DELETE`, और डिज़ाइन से `HEAD`/`OPTIONS`), जिससे timeout के बाद retries सुरक्षित होते हैं। `POST` दोनों नहीं है: उसे दोहराने से दूसरा resource बन सकता है। `PUT` ज्ञात URL पर पूरे resource को **बदलता** है; `PATCH` **आंशिक** बदलाव लगाता है; `DELETE` resource हटाता है (पहले से हटी चीज़ को हटाना फिर भी ठीक होना चाहिए)। स्थिति बदलने के लिए `GET` कभी उपयोग न करें, क्योंकि links, prefetchers और caches उन्हें चला देंगे।

## Methods की गारंटियाँ एक नज़र में

किसी ऑपरेशन के लिए कौन-सा method ठीक है यह तय करते समय इस तालिका का उपयोग करें।

```text
Method   Safe  Idempotent  Typical use
GET      yes   yes         read a resource or a collection
HEAD     yes   yes         headers only (check existence, size, ETag)
PUT      no    yes         replace a resource at a known URL
PATCH    no    no*         partial update (*can be made idempotent)
DELETE   no    yes         remove a resource
POST     no    no          create, or run an action
```

## PATCH के लिए JSON Merge Patch, चलाकर

मैंने यह सादा-Python उदाहरण चलाया। JSON Merge Patch (RFC 7396) सरल आंशिक-अपडेट format है: patch की keys बदलती या जुड़ती हैं, nested objects मिलते हैं, और `null` मान key हटाता है। Arrays पूरी बदल जाती हैं। यहाँ `pin` हटा, `state` जुड़ा और `tags` बदले।

```python
import hmac, hashlib, json, time, bisect

def merge_patch(target, patch):
    if not isinstance(patch, dict): return patch
    result = dict(target) if isinstance(target, dict) else {}
    for k, v in patch.items():
        if v is None: result.pop(k, None)
        else: result[k] = merge_patch(result.get(k), v)
    return result
doc = {"name": "Asha", "address": {"city": "Pune", "pin": "411001"}, "tags": ["a"]}
print(merge_patch(doc, {"address": {"pin": None, "state": "MH"}, "tags": ["x", "y"], "name": "Asha R"}))

```

Output:

```
{'name': 'Asha R', 'address': {'city': 'Pune', 'state': 'MH'}, 'tags': ['x', 'y']}
```

**Quiz:** कौन-सा method idempotent है और पूरे resource को बदलता है?

- [ ] OPTIONS
- [ ] POST
- [ ] GET
- [x] PUT

*Answer:* PUT. PUT resource को दिए रूप पर सेट करता है, इसलिए दोहराने पर वही स्थिति रहती है।
