रीस्ट - एक्सेप्ट हेडर बनाम एक्सटेंशन के माध्यम से कंटेंट बातचीत के बीच ट्रेडऑफ


40

मैं एक डिजाइन एपीआई के माध्यम से काम कर रहा हूँ। हम जानते हैं कि हम JSON और XML को किसी भी संसाधन के लिए वापस करना चाहते हैं। मैं सोच रहा था कि हम कुछ ऐसा करेंगे:

GET /api/something?param1=value1
Accept:  application/xml (or application/json)

हालाँकि, किसी ने इसके लिए एक्सटेंशन का उपयोग करके टॉस किया, जैसे:

GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)

इन दृष्टिकोणों के साथ व्यापार क्या हैं? जब एक्सटेंशन निर्दिष्ट नहीं किया जाता है, तो क्या यह स्वीकार्य हैडर पर भरोसा करना सबसे अच्छा है, लेकिन जब निर्दिष्ट एक्सटेंशन का सम्मान करते हैं? क्या उस दृष्टिकोण में कोई कमी है?


आप किस वेबसर्वर का उपयोग कर रहे हैं? और यह URL कैसे पार्स करता है?
दीपन मेहता

1
मुझे चीजों के तकनीकी (सर्वर) पक्ष के बारे में कोई जानकारी नहीं है। यह कहा जा रहा है, मैं आपके दृष्टिकोण को पसंद करता हूं, क्योंकि यह http मानक का उपयोग करता है, जो समझने में आसान बनाता है (उदाहरण के लिए जब कोई व्यक्ति सड़क पर कुछ साल पहले इस पर कुछ रखरखाव करने वाला हो)। आप एक्सटेंशन पर भरोसा कर सकते हैं जब स्वीकार निर्दिष्ट नहीं है, या एक अप्रत्याशित मूल्य है, लेकिन मैं हमेशा मानक तरीके से पहले जाऊंगा।
ट्रेब

@ विपन मैं इसे एमवीसी 4 वेब एपीआई (अभी भी बीटा में) के साथ हैक कर रहा हूं। यह ASP.NET के रूटिंग अमूर्त का उपयोग करता है, जो बहुत अच्छे हैं।
ब्रैंडन लिंटन

1
@Treb हाँ, मैं हेडर मान को स्वीकार करने का बहुत अधिक प्रशंसक हूँ। अगर दोनों को सपोर्ट करने में कोई कमी है तो मैं सोच रहा हूं।
ब्रैंडन लिंटन

जवाबों:


38

यह, "हालांकि, दार्शनिक रूप से - पहला दृष्टिकोण ही एकमात्र दृष्टिकोण है।", और यह "उचित आधिकारिक उत्साहपूर्ण दृष्टिकोण स्वीकार: हेडर का उपयोग करना है।" कर रहे हैं व्यापक रूप से देखा मामला है, लेकिन यह भी कर रहे हैं पूरी तरह से गलत

यहां रॉय फील्डिंग (जिन्होंने REST को परिभाषित किया) से एक संक्षिप्त स्निपेट है ...

"खंड 6.2.1 यह नहीं कहता है कि हर समय सामग्री बातचीत का उपयोग किया जाना चाहिए।" अदालत में तलब करना

वह विशेष बातचीत 'स्वीकार-भाषा:' शीर्ष लेख के संदर्भ में है, लेकिन वही 'स्वीकृति:' शीर्ष लेख के लिए समान रूप से लागू होता है, जैसा कि उनकी प्रतिक्रिया में बाद में स्पष्ट हुआ ...

"मुझे नहीं पता कि लोग शीर्ष पृष्ठ पर दूसरा और तीसरा लिंक क्यों नहीं देख सकते हैं

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

वह दो पीडीएफ संस्करणों की ओर इशारा करता है। ”

उसका क्या मतलब है कि एक ही स्रोत डेटा के विभिन्न अभ्यावेदन के लिए अलग-अलग समापन बिंदुओं का उपयोग करने में कोई समस्या नहीं है। (इस मामले में एक। Html एंडपॉइंट और दो अलग-अलग .pdf एंडपॉइंट।)

इसी तरह की चर्चा में, इस बार क्वेरी मापदंडों का उपयोग करने के गुणों के बारे में बनाम विभिन्न मीडिया प्रकारों के लिए फ़ाइल एक्सटेंशन का उपयोग करके ...

"यही कारण है कि मैं हमेशा एक्सटेंशन पसंद करता हूं। न तो पसंद का REST से कोई लेना-देना है।" अदालत में तलब करना

फिर, यह स्वीकार बनाम फ़ाइल नाम एक्सटेंशन से थोड़ा अलग है, लेकिन फील्डिंग का रुख अभी भी स्पष्ट है।

जवाब - यह वास्तव में ज्यादा मायने नहीं रखता। दोनों के बीच का व्यापार बहुत महत्वपूर्ण नहीं है और दोनों स्वीकार्य शैली हैं।


3
शानदार संतुलित जवाब। मुझे लगता है कि मैं कभी-कभी यूआरआई से 'स्पष्ट' जोड़ूंगा कि एक निश्चित सामग्री का इरादा है। जैसे। URI में .html एक्सटेंशन या .pdf एक्सटेंशन। और इस मामले में सामग्री बातचीत का समर्थन करने की वास्तव में कोई आवश्यकता नहीं है, और यूआरआई में निहित सामग्री होने से मनुष्यों के लिए यूआरआई को साझा करना और चीजों को लिंक करने के लिए इसका उपयोग करना आसान हो जाता है, जिससे वे तुरंत उपभोग कर सकते हैं। अन्य मामलों में जैसे कि आप अपने यूआरआई में एक्सटेंशन से बचना चाहते हैं, और / या आप एक वेब एपीआई को उजागर करना चाहते हैं जो समान रूप से कई कंटेंट टाइप json / XML का समर्थन करता है, एक एक्सेप्ट हेडर बेहतर फिट हो सकता है।
टिम लोवेल-स्मिथ

नए लिंक शामिल करने के लिए अद्यतित उत्तर। मुझे लगता है कि याहू समूहों ने अपनी संरचना को चारों ओर बदल दिया है।
फिल स्टर्जन

मैं असहमत हूं। सर्वर द्वारा लौटाए जा रहे संसाधन विवरण भाषा को सेवा समापन बिंदु द्वारा निष्पादित व्यावसायिक तर्क के लिए अप्रासंगिक होना चाहिए। एक ही सेवा समापन बिंदु के लिए कई यूआरआई होने से, बस विभिन्न संसाधन विवरण भाषाओं को समायोजित करने के लिए, यह गलतफहमी की तरह लगता है कि बाकी यूआरआई का निर्माण कैसे किया जाना चाहिए।
देजय क्लेटन

10

Accept:हेडर का उपयोग करने के लिए उचित आधिकारिक Restful दृष्टिकोण है ।

हालांकि, आपको सावधान रहना होगा कि कैचेबिलिटी को न तोड़ें, जो कि आरईएसटी की आवश्यकताओं में से एक है। आपको Vary: Acceptहेडर और कैश की आवश्यकता है जो इसे समझता है। आदर्श दुनिया में आपके पास यह होगा, लेकिन वास्तविक जीवन में आपका मिलन भिन्न हो सकता है। तो दूसरा समाधान उतना साफ नहीं है, लेकिन यह अधिक व्यावहारिक हो सकता है।

इसके अलावा, ध्यान दें कि कुछ बहुत पुराने ब्राउज़र हेडर को अनदेखा करते थे, इसके बजाय एक्सटेंशन पर भरोसा करते थे।


1
तथ्यात्मक रूप से गलत है। स्वीकृत उत्तर देखें।
फिल स्टर्जन

9

तकनीकी रूप से यह वास्तव में मायने नहीं रखता है - आपका वेब सर्वर उचित रूप से प्रक्रिया को पारित करने में सक्षम होगा जैसा कि यह दिखता है। (मैं यह मान रहा हूं लेकिन शोस्टॉपर की तरह नहीं दिखता)।

हालांकि, दार्शनिक रूप से - पहला दृष्टिकोण एकमात्र दृष्टिकोण है। REST में, URL वास्तव में केवल एक URI को इंगित करता है - जो केवल एक संसाधन है। एक पल के लिए इस बारे में सोचो संसाधन के रूप में ही वस्तु वस्तु उन्मुख प्रोग्रामिंग में। आप केवल 4 विधियों (उर्फ GET / POST / PUT / DELETE -or के माध्यम से इस संसाधन से बात करते हैं अगर कुछ भी जो परिवहन की अनुमति देता है) लेकिन वह विधि वस्तु का विवरण नहीं बनती है । उसी तरह, वापसी मूल्य का पहलू यूआरआई नहीं है। ऑब्जेक्ट अभी भी कुछ है और कुछ नहीं है। xml या कुछ। json

मान लीजिए कि आप हेडर स्वीकार नहीं करना चाहते हैं, लेकिन अगर आप अभी भी वास्तव में दार्शनिक रूप से बनना चाहते हैं, तो मुझे कुछ पसंद नहीं है:

GET /api/something?parm1=value1&return_type=xml

विरोध के रूप में

GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)

लेकिन जैसा कि मैंने कहा, यह अंतर केवल दार्शनिक है।


+1 दीपन, आप एक चीज को छोड़कर सही हैं: / api / something? Return_type = xml अभी भी बाकी नहीं है । कारण यह नहीं है कि RESTful यह URL अपारदर्शी है। IOW, प्रोटोकॉल के दृष्टिकोण से, / api / something / xml और / api / something? Xml के बीच कोई अंतर नहीं है। W3.org/DesignIssues/Axioms.html देखें ।
मार्क ई। हासे

0

@vartec: मुझे लगता है कि आप गलत हैं

उचित आधिकारिक Restful सिद्धांत का कहना है कि HTTP हेडर में कुछ भी छिपाया नहीं जाना चाहिए क्योंकि यह URI है जो उजागर या संदर्भित है, अनुरोध / प्रतिक्रिया के बारे में कोई विवरण URI के हिस्से के रूप में प्रदान किया जाना चाहिए

इसलिए मैं दृढ़ता से उन विवरणों के लिए हेडर का उपयोग करने से बचने की सलाह देता हूं जो अनुरोध और प्रतिक्रिया के बारे में हैं, और उनसे चिपके रहते हैं

 GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)

मैं संदर्भों को शीघ्रता से खोजने में सक्षम नहीं हूं, लेकिन मैं उनके साथ वापस पोस्ट करूंगा (वास्तव में आप ओवेरी प्रकाशन की पुस्तक "रेस्टफुल वेब सर्विसेज" ( http://shop.oreilly.com/product/9780596529260.do ) का उल्लेख कर सकते हैं ) जो इसकी पुष्टि करता है


17
-1 पूरी तरह से गलत। एक बात के लिए, यूआरएल है HTTP हेडर में भेजा है। इसके अलावा, प्रत्येक अलग URL को एक अलग संसाधन का प्रतिनिधित्व करना चाहिए। एक ही सामग्री के XML और JSON एन्कोडिंग स्पष्ट रूप से 2 अलग-अलग संसाधन नहीं हैं; वे एक ही संसाधन के 2 अलग-अलग प्रतिनिधित्व हैं।
मार्क ई। हासे

HTTP हेडर "मैसेजिंग मेटाडेटा" को संग्रहीत करने के लिए एक वैध और अनुशंसित स्थान है, जैसे: सुरक्षा क्रेडेंशियल, सहसंबंध पहचानकर्ता, सत्र आईडी, लेन-देन संदर्भ, डेटा प्रारूप। इस तरह की जानकारी आपके URL या आपके संदेश पेलोड को अव्यवस्थित नहीं करना चाहिए।
पाउलो मर्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.