HATEOAS का उपयोग करके एक RESTful वेब सेवा को डिजाइन करने में, पूर्ण URL के रूप में एक लिंक दिखाने के पेशेवरों और विपक्ष क्या हैं (" http: // server: port / application / customers / 1234 ") बनाम पथ ("/ एप्लिकेशन /" ग्राहकों / 1234 ")?
HATEOAS का उपयोग करके एक RESTful वेब सेवा को डिजाइन करने में, पूर्ण URL के रूप में एक लिंक दिखाने के पेशेवरों और विपक्ष क्या हैं (" http: // server: port / application / customers / 1234 ") बनाम पथ ("/ एप्लिकेशन /" ग्राहकों / 1234 ")?
जवाबों:
एक सूक्ष्म वैचारिक अस्पष्टता है जब लोग "रिश्तेदार यूआरआई" कहते हैं।
द्वारा RFC3986 की परिभाषा , एक सामान्य यूआरआई शामिल हैं:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
मुश्किल बात यह है कि, जब योजना और अधिकार छोड़े जाते हैं, तो "पथ" भाग या तो एक निरपेक्ष पथ हो सकता है (शुरू होता है /
) या "मूल" सापेक्ष पथ। उदाहरण:
"http://example.com:8042/over/there?name=ferret"
/over/there
here
या ./here
या ../here
या आदिइसलिए, यदि प्रश्न "क्या एक सर्वर को आराम से प्रतिक्रिया में रिश्तेदार पथ का उत्पादन करना चाहिए ", तो उत्तर "नहीं" है और विस्तार से कारण यहां उपलब्ध है । मुझे लगता है कि "रिश्तेदार यूआरआई" के खिलाफ ज्यादातर लोग (मुझे शामिल करें) वास्तव में "रिश्तेदार पथ" के खिलाफ हैं।
और व्यवहार में, सबसे सर्वर साइड MVC ढांचे आसानी से उत्पन्न कर सकते हैं सापेक्ष URI निरपेक्ष पथ के साथ इस तरह के रूप /absolute/path/to/the/controller
, और प्रश्न बन जाता है "कि सर्वर कार्यान्वयन एक उपसर्ग चाहिए scheme://hostname:port
निरपेक्ष पथ के सामने"। ओपी के सवाल की तरह। मैं इस बारे में निश्चित नहीं हूं।
एक ओर, मुझे अभी भी लगता है कि सर्वर एक पूर्ण यूरी लौटने की सिफारिश की है। हालाँकि, सर्वर को स्रोत कोड के अंदर की hostname:port
चीज़ को कभी भी इस तरह से हार्डकोड नहीं करना चाहिए (अन्यथा मैं पूर्ण पथ के साथ संबंधित uri के लिए कमबैक करूंगा)। समाधान सर्वर-साइड है जो हमेशा HTTP अनुरोध के "होस्ट" हेडर से उस उपसर्ग को प्राप्त करता है। यह सुनिश्चित नहीं है कि यह हर स्थिति के लिए काम करता है या नहीं।
दूसरी ओर, ग्राहक के लिए http://example.com:8042
और पूर्ण मार्ग को समाप्त करना बहुत कठिन नहीं लगता है। आखिरकार, क्लाइंट को पहले से ही उस स्कीम और डोमेन नाम का पता चल जाता है जब वह सर्वर को रिक्वेस्ट भेजता है?
सब के सब, मैं कहूंगा, निरपेक्ष यूआरआई का उपयोग करने की सलाह देते हैं, संभवतः निरपेक्ष पथ के साथ रिश्तेदार यूआरआई के लिए वापसी, कभी भी सापेक्ष पथ का उपयोग न करें ।
यह निर्भर करता है कि क्लाइंट कोड कौन लिख रहा है। यदि आप क्लाइंट और सर्वर लिख रहे हैं तो इससे बहुत फर्क नहीं पड़ता है। आप या तो क्लाइंट पर या सर्वर पर URL के निर्माण का दर्द झेलेंगे।
हालाँकि, यदि आप सर्वर का निर्माण कर रहे हैं और आप अन्य लोगों से क्लाइंट कोड लिखने की अपेक्षा करते हैं तो वे आपको अधिक पसंद करेंगे यदि आप पूरा यूआरआई प्रदान करते हैं। रिश्तेदार यूआरआई को हल करना थोड़ा मुश्किल हो सकता है। पहले आप उन्हें कैसे हल करते हैं यह मीडिया-प्रकार पर निर्भर करता है। Html का आधार टैग है, Xml में xml हो सकता है: प्रत्येक नेस्टेड तत्व में आधार टैग, Atom फीड में आधार और सामग्री में एक अलग आधार हो सकता है। यदि आप अपने ग्राहक को आधार यूआरआई के बारे में स्पष्ट जानकारी नहीं देते हैं, तो उन्हें आधार यूआरआई को अनुरोध यूआरआई से प्राप्त करना होगा, या शायद सामग्री-स्थान हेडर से! और उस अनुगामी स्लेश के लिए बाहर देखो। आधार URI अंतिम स्लैश के दाईं ओर सभी वर्णों को अनदेखा करके निर्धारित किया जाता है। इसका मतलब यह है कि रिश्तेदार URI का समाधान करते समय ट्रेलिंग स्लैश अब बहुत महत्वपूर्ण है।
केवल एक अन्य मुद्दे पर एक छोटे से उल्लेख की आवश्यकता होती है जो दस्तावेज़ का आकार है। यदि आप उन आइटमों की एक बड़ी सूची लौटा रहे हैं, जिनमें प्रत्येक आइटम में कई लिंक हो सकते हैं, तो निरपेक्ष URL का उपयोग करके आपकी इकाई में एक महत्वपूर्ण मात्रा में बाइट्स जोड़ सकते हैं यदि आप इकाई को संपीड़ित नहीं करते हैं। यह एक संपूर्ण मुद्दा है और आपको यह तय करने की आवश्यकता है कि क्या यह केस के आधार पर महत्वपूर्ण है।
आपके आवेदन के पैमानों के अनुसार, आप लोड बैलेंसिंग, फेल-ओवर इत्यादि करना चाह सकते हैं। यदि आप निरपेक्ष यूआरआई लौटाते हैं, तो आपके क्लाइंट-साइड ऐप आपके सर्वर के विकसित कॉन्फ़िगरेशन का पालन करेंगे।
/xxx/yyy...
) के रूप में परिभाषित करें और न कि पूरी तरह से योग्य यूआरआई (जैसे http://api.example.com/xxx/yyy...
)।
रेलाउ के ट्राइकोटॉमी का उपयोग करके मेरे संगठन ने पक्षपात (2) का विकल्प चुना है। XSS (क्रॉस-साइट स्क्रिप्टिंग) हमलों से बचने के लिए प्राथमिक कारण है। मुद्दा यह है, अगर कोई हमलावर सर्वर से वापस आने वाली प्रतिक्रिया में अपने स्वयं के URL रूट को इंजेक्ट कर सकता है, तो बाद के उपयोगकर्ता अनुरोध (जैसे उपयोगकर्ता नाम और पासवर्ड के साथ प्रमाणीकरण अनुरोध) को हमलावर के स्वयं के सर्वर पर भेजा जा सकता है *।
कुछ लोगों ने लोड संतुलन के लिए अन्य सर्वरों के अनुरोधों को पुनर्निर्देशित करने में सक्षम होने का मुद्दा उठाया है, लेकिन (जबकि यह मेरी विशेषज्ञता का क्षेत्र नहीं है) मैं समझूंगा कि लोड संतुलन को स्पष्ट रूप से अलग करने के लिए क्लाइंट को अलग किए बिना लोड संतुलन को सक्षम करने के बेहतर तरीके हैं। मेजबान।
* कृपया मुझे बताएं कि क्या तर्क की इस पंक्ति में कोई दोष है। बेशक, लक्ष्य सभी हमलों को रोकने के लिए नहीं है, लेकिन हमले के कम से कम एक एवेन्यू।
आपको हमेशा पूर्ण URL का उपयोग करना चाहिए। यह संसाधन के लिए विशिष्ट पहचानकर्ता के रूप में कार्य करता है क्योंकि URL के लिए सभी को अद्वितीय होना आवश्यक है।
मैं यह भी तर्क दूंगा कि आपको सुसंगत होना चाहिए। चूंकि HTTP HTTP शीर्ष लेख HTTP विनिर्देश के आधार पर एक पूर्ण URL की अपेक्षा करता है, इसलिए जब नया संसाधन बनाया जाता है, तो पूर्ण URL ग्राहक को स्थान शीर्षलेख में वापस भेज दिया जाता है। यह आपके लिए अजीब होगा कि आप अपने शीर्ष लेख में लिंक्स में स्थान हेडर और उसके बाद संबंधित यूआरआई में एक पूर्ण URL प्रदान करें।
Location
हैडर की कल्पना का उदाहरण बिल्कुल यही देता है - एक निरपेक्ष यूआरआई जिसमें यूआरआई योजना या सर्वर का नेटवर्क स्थान शामिल नहीं है। जबकि लिंक और आईडी को अक्सर स्वीकार किया जाता है कि वे एक ही चीज नहीं हैं - पूर्व में संदर्भ है, बाद वाला नहीं है।
बड़े एपीआई परिणामों में एक महत्वपूर्ण विचार बार-बार पूर्ण यूआरआई सहित अतिरिक्त नेटवर्क ओवरहेड है। मानो या न मानो, gzip इस मुद्दे को पूरी तरह से हल नहीं करता है (सुनिश्चित नहीं है कि क्यों)। हम इस बात से हैरान थे कि जब परिणाम में सैकड़ों लिंक शामिल थे तो पूरा यूआरआई कितना स्थान लेता था।
निरपेक्ष यूआरआई का उपयोग करने का एक दोष यह है कि एपी को अनुमानित नहीं किया जा सकता है।
इसे वापस ले लो ... सच नहीं है। आपको डोमेन सहित पूर्ण URL के लिए जाना चाहिए।
पेशेवरों के बारे में, मैं देख रहा हूँ कि बाइट्स में कमी को ग्राहक द्वारा (पूर्ण) पथ के लिए आवश्यक अतिरिक्त हैंडलिंग की कीमत पर प्रेषित किया जाना है। यदि आप हर बाइट को बचाने के लिए बेताब हैं, भले ही गज़िप के रूप में सामग्री-एन्कोडिंग की कोशिश कर रहे हों, कैशिंग हेडर का उचित उपयोग, ग्राहक पर etags और सशर्त अनुरोधों का उपयोग, तो यह अंत में आवश्यक हो सकता है, लेकिन मुझे उच्च रिटर्न की उम्मीद है आपके प्रयास खत्म हो गए।
विपक्ष के बारे में, मुझे इस बारे में नियंत्रण का नुकसान दिखाई देता है कि आप भविष्य में संसाधनों के बीच ग्राहकों के प्रवाह को कैसे निर्देशित कर सकते हैं (लोड संतुलन, ए / बी परीक्षण, ...), और मैं इसे वेब के प्रबंधन के संबंध में एक बुरा अभ्यास मानूंगा। एपीआई। आपके द्वारा प्रदान किया जाने वाला URL क्लाइंट के लिए मूल रूप से अपारदर्शी नहीं है ( यूआरआई अपारदर्शिता पर वेब आर्किटेक्चर के टिम बर्नर्स-ली एयॉम्स देखें )। अंत में, आप अपने एपीआई के रचनात्मक उपयोग के बारे में ग्राहकों को खुश रखने के लिए ज़िम्मेदार बन जाते हैं, भले ही वह आपके URL स्थान की संरचना के बारे में ही क्यों न हो। क्या आपको कभी स्पष्ट रूप से परिभाषित URL संशोधन के लिए अनुमति देने की आवश्यकता है, हाइपरटेक्स्ट एप्लिकेशन भाषा में उपयोग किए गए URI टेम्पलेट्स के उपयोग पर विचार करें ।