# Content Negotiation और Accept Header — API Design और Versioning

Source: https://www.geekswithgeeks.com/hi/api-design/ver-content-negotiation

> Clients को q-values के साथ पसंदीदा formats या versions बताने दें और उसी के अनुसार उत्तर दें।

## Client अपनी पसंद बताता है

**Content negotiation** में client `Accept` header में स्वीकार्य प्रतिनिधित्व सूचीबद्ध करता है, हर एक के साथ 0 से 1 तक वैकल्पिक quality मान `q` (डिफ़ॉल्ट 1), और server अपने समर्थित में से सबसे अच्छा मेल चुनता है या **`406 Not Acceptable`** देता है (या डिफ़ॉल्ट पर लौटता है)। यही तंत्र `application/vnd.example.v2+json` जैसे vendor media type से **version** भी चुन सकता है। जिन responses पर यह निर्भर है उन पर हमेशा `Vary: Accept` header रखें ताकि caches अलग copies रखें, और दर्ज करें कि कोई पसंद न भेजी जाए तो क्या होता है।

## q-values के साथ Accept parse करना, चलाकर

मैंने यह सादा-Python उदाहरण चलाया। सबसे ऊँची quality वाला media type पहले आता है: v2 vendor type (q=0.9), फिर सादा JSON (0.5), फिर wildcard (0.1)।

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

def parse_accept(h):
    items = []
    for part in h.split(","):
        bits = part.strip().split(";"); q = 1.0
        for b in bits[1:]:
            if b.strip().startswith("q="): q = float(b.strip()[2:])
        items.append((q, bits[0].strip()))
    return [m for q, m in sorted(items, key=lambda x: -x[0])]
print(parse_accept("application/vnd.example.v2+json;q=0.9, application/json;q=0.5, */*;q=0.1"))

```

Output:

```
['application/vnd.example.v2+json', 'application/json', '*/*']
```

## सुरक्षित डिफ़ॉल्ट रखें

Client कोई version न भेजे तो नवीनतम की जगह स्थिर, दस्तावेज़ित डिफ़ॉल्ट (अक्सर सबसे पुराना समर्थित version) परोसें, ताकि मौजूदा integrations उनके नीचे न बदलें।

**Quiz:** Response Accept पर निर्भर हो तो कौन-सा header जोड़ना चाहिए?

- [x] Vary: Accept
- [ ] Content-Length: 0
- [ ] Retry-After
- [ ] Location

*Answer:* Vary: Accept. Vary caches को बताता है कि response Accept header से अलग होता है, जिससे ग़लत copy परोसने से बचाव होता है।
