पाठ 18 / 27
Content Negotiation और Accept Header
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)।
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 उनके नीचे न बदलें।
त्वरित जाँच: Response Accept पर निर्भर हो तो कौन-सा header जोड़ना चाहिए?
- Vary: Accept
- Content-Length: 0
- Retry-After
- Location
Answer
Vary: Accept — Vary caches को बताता है कि response Accept header से अलग होता है, जिससे ग़लत copy परोसने से बचाव होता है।