api रीस्टफुल एपीआई रनटाइम एक्सचेंजिबिलिटी/हैटओएएस क्लाइंट डिज़ाइन




rest discovery (7)

आपने अपना घर का काम किया और आप इसके दिल में पहुंचे: रनटाइम डिस्कवरी पवित्र ग्रिल है। इसका पीछा मत करो।

यूडीडीआई रनटाइम डिस्कवरी की एक जबरदस्त कहानी बताती है: http://en.wikipedia.org/wiki/Universal_Description_Discovery_and_Integration

एक सास स्टार्टअप के लिए मैं इसमें शामिल हूं, मैं एक विश्वसनीय वेब एपीआई और कुछ क्लाइंट ऐप दोनों का निर्माण कर रहा हूं जो इसका उपभोग करते हैं। मुझे लगता है कि मुझे एपीआई पता चला है, लेकिन अब मैं ग्राहकों के लिए बदल रहा हूं। जैसा कि मैं आरईएसटी के बारे में पढ़ रहा हूं, मैं देखता हूं कि आरईएसटी का एक महत्वपूर्ण हिस्सा खोज है , लेकिन वास्तव में खोज के दो अलग-अलग व्याख्याओं के बीच बहस हो रही है:

  1. डेवलपर डिस्कवरी : डेवलपर हार्ड-कोड क्लाइंट में एपीआई विवरणों की अत्यधिक मात्रा, जैसे संसाधन यूआरआई, क्वेरी पैरामीटर, समर्थित HTTP विधियां, और दस्तावेज़ों को ब्राउज़ करके और एपीआई के प्रतिक्रियाओं के प्रयोग के माध्यम से खोजे गए अन्य विवरण। इस प्रकार की खोज आईएमएचओ को कूल लिंकेज और एपीआई वर्जनिंग प्रश्न की आवश्यकता होती है, और एपीआई को क्लाइंट कोड की हार्ड युग्मन की ओर ले जाती है। आरपीसी के एक अच्छी तरह से प्रलेखित संग्रह का उपयोग करने से बेहतर नहीं लगता है।

  2. रनटाइम डिस्कवरी - क्लाइंट ऐप स्वयं को कम या बिना किसी बैंड की जानकारी के साथ आवश्यक सबकुछ समझने में सक्षम है (संभवतः, मीडिया प्रकारों के बारे में केवल एपीआई सौदों का ज्ञान।) लिंक गर्म हो सकते हैं। लेकिन एपीआई को बहुत ही कुशल बनाने के लिए, क्वेरी पैरामीटर के लिए बहुत से लिंक टेम्पलेटिंग की आवश्यकता होती है, जो ऑफ-ऑफ-बैंड जानकारी वापस आती है। संभवतः अन्य कठिनाइयों को मैंने अभी तक नहीं सोचा है क्योंकि मेरे पास नहीं है विकास में उस बिंदु पर प्राप्त किया। लेकिन मुझे ढीले युग्मन के विचार पसंद हैं।

रनटाइम खोज आरईएसटी का पवित्र अंगूर प्रतीत होता है, लेकिन मैं इस तरह के ग्राहक को कार्यान्वित करने के बारे में कीमती छोटी चर्चा देख रहा हूं। मुझे लगता है कि लगभग सभी REST स्रोत डेवलपर खोज मानते हैं। किसी को कुछ रनटाइम खोज संसाधनों के बारे में पता है? सर्वोत्तम प्रथाएं? असली कोड के साथ उदाहरण या पुस्तकालय? मैं एक ग्राहक के लिए PHP (ज़ेंड फ्रेमवर्क) में काम कर रहा हूं। उद्देश्य के लिए उद्देश्य सी (आईओएस)।

क्या रनटाइम खोजकर्ता यथार्थवादी लक्ष्य है, डेवलपर समुदाय में उपकरण और ज्ञान के वर्तमान सेट को देखते हुए? मैं अपने यूआरआई को सभी अप्रासंगिक तरीके से इलाज करने के लिए लिख सकता हूं, लेकिन यह सबसे कुशलता से कैसे करना है, विशेष रूप से कम बैंडविड्थ कनेक्शन पर। वैसे भी, यूआरआई समीकरण का केवल एक हिस्सा हैं। रनटाइम संदर्भ में लिंक टेम्पलेटिंग के बारे में क्या? बहुत से विकल्प अनुरोध करने के अलावा, किन तरीकों का समर्थन किया जाता है, इस बारे में संचार करने के बारे में कैसे?


मूल रनटाइम डिस्कवरी क्लाइंट के दूसरे उदाहरण के लिए, एचएएल टॉक हाइपरमीडिया एपीआई क्लाइंट डेमो देखें

हाइपरटेक्स्ट एप्लिकेशन भाषा (लिंक करने के लिए एक्सएमएल + जेएसओएन स्कीमा) के आधार पर: http://stateless.co/hal_specification.html


एपीआई 'रीस्टफुल' को कॉल करने से पहले संतुष्ट होने वाली आवश्यकताओं में से एक यह है कि उस एपीआई के शीर्ष पर एक सामान्य क्लाइंट एप्लिकेशन लिखना संभव होना चाहिए। जेनेरिक क्लाइंट के साथ, उपयोगकर्ता को सभी एपीआई की कार्यक्षमता तक पहुंचने में सक्षम होना चाहिए। एक सामान्य ग्राहक एक क्लाइंट एप्लिकेशन होता है जो यह नहीं मानता कि किसी भी संसाधन के पास मीडिया प्रकार द्वारा परिभाषित संरचना से परे एक विशिष्ट संरचना है। उदाहरण के लिए, एक वेब ब्राउज़र एक सामान्य ग्राहक है जो जानता है कि एचटीएमएल फॉर्म आदि सहित एचटीएमएल की व्याख्या कैसे करें।

अब, मान लें कि हमारे पास एक वेब शॉप के लिए एक HTTP / JSON API है और हम एक HTML / CSS / जावास्क्रिप्ट क्लाइंट बनाना चाहते हैं जो हमारे ग्राहकों को उत्कृष्ट उपयोगकर्ता अनुभव प्रदान करे। क्या यह क्लाइंट एक सामान्य क्लाइंट एप्लिकेशन होने देने के लिए एक यथार्थवादी विकल्प होगा? नहीं। हम प्रत्येक विशिष्ट डेटा तत्व और प्रत्येक विशिष्ट आवेदन स्थिति के लिए एक विशिष्ट रूप और अनुभव प्रदान करना चाहते हैं। हम एपीआई में इन प्रस्तुति-विनिर्देशों के बारे में सभी ज्ञान शामिल नहीं करना चाहते हैं, इसके विपरीत, क्लाइंट को दिखने और महसूस करना चाहिए और एपीआई को केवल डेटा लेना चाहिए। इसका तात्पर्य यह है कि क्लाइंट में विशिष्ट लेआउट और उपयोगकर्ता इंटरैक्शन के लिए विशिष्ट संसाधन तत्वों की हार्ड-कोडेड युग्मन है।

क्या यह हैटियोस का अंत है और इस प्रकार आरईएसटी का अंत है? हां और नहीं

हां , क्योंकि अगर हम क्लाइंट में एपीआई के बारे में कड़ी-कोड ज्ञान रखते हैं, तो हम हेटोएस के लाभ को खो देते हैं: सर्वर-साइड परिवर्तन क्लाइंट को तोड़ सकता है।

नहीं , दो कारणों से:

  1. "रीस्टफुल" होने के नाते ग्राहक की नहीं, एपीआई की एक संपत्ति है। जब तक यह संभव है, सिद्धांत रूप में , एक सामान्य क्लाइंट बनाने के लिए जो एपीआई की सभी क्षमताओं की पेशकश करता है, एपीआई को रीस्टफुल कहा जा सकता है। तथ्य यह है कि ग्राहक नियमों का पालन नहीं करते हैं, एपीआई की गलती नहीं है। तथ्य यह है कि एक सामान्य ग्राहक के पास एक उदार उपयोगकर्ता अनुभव होगा कोई मुद्दा नहीं है। यह जानना महत्वपूर्ण क्यों है कि एक सामान्य ग्राहक होना संभव है, अगर हमारे पास वास्तव में वह सामान्य ग्राहक नहीं है? यह मुझे दूसरे कारण में लाता है:
  2. एक रीस्टफुल एपीआई ग्राहकों को यह चुनने का विकल्प प्रदान करता है कि वे कितना सामान्य होना चाहते हैं, यानि सर्वर-साइड परिवर्तनों के प्रति कितना लचीला होना चाहते हैं। जिन ग्राहकों को एक महान उपयोगकर्ता अनुभव प्रदान करने की आवश्यकता है, वे अभी भी यूआरआई परिवर्तनों के लिए लचीला हो सकते हैं, डिफ़ॉल्ट मानों में परिवर्तन और अधिक के लिए। उपयोगकर्ता इंटरैक्शन के बिना बैच नौकरियां करने वाले ग्राहक अन्य प्रकार के परिवर्तनों के लिए लचीला हो सकते हैं।

यदि आप व्यावहारिक उदाहरणों में रूचि रखते हैं, तो मेरे जर्स्ट पेपर को चेकआउट करें। अंतिम खंड हैटओएएस के बारे में है। आप देखेंगे कि जेएआरएस्ट के साथ, यहां तक ​​कि अत्यधिक इंटरैक्टिव और दृष्टि से आकर्षक ग्राहक भी सर्वर-साइड परिवर्तनों के लिए काफी लचीला हो सकते हैं, हालांकि 100% नहीं।


चित्त आकर्षण करनेवाला। आप जो वर्णन कर रहे हैं वह मूल रूप से हैटोस सिद्धांत है। आप क्या हेटोस पूछते हैं? इसे पढ़ें: http://en.wikipedia.org/wiki/HATEOAS

आम आदमी के शब्दों में, हैटओएएस का मतलब है लिंक का पालन करें। यह दृष्टिकोण आपके क्लाइंट को विशिष्ट यूआरएल से हटा देता है और आपको किसी को तोड़ने के बिना अपने एपीआई को बदलने की लचीलापन देता है।


यह निश्चित रूप से दरार करने के लिए एक कठिन अखरोट है। Google पर, हमने अपनी डिस्कवरी सेवा लागू की है कि हमारे सभी नए एपीआई बनाए गए हैं। टीएल; डीआर संस्करण हम एक जेएसओएन स्कीमा-जैसी कल्पना उत्पन्न करते हैं कि हमारे ग्राहक पार्स कर सकते हैं - उनमें से कई गतिशील रूप से।

इसका परिणाम डेवलपर के लिए आसान एसडीके उन्नयन और हमारे लिए आसान / बेहतर रखरखाव का मतलब है।

किसी भी तरह से सही समाधान नहीं है, लेकिन हमारे कई देवताओं को पसंद है।

अधिक जानकारी के लिए link देखें (और vid को देखना सुनिश्चित करें।)


तुम लिखो:

एपीआई को बहुत ही कुशल बनाने के लिए, क्वेरी पैरामीटर के लिए बहुत से लिंक टेम्पलेटिंग की आवश्यकता होती है, जो ऑफ-ऑफ-बैंड जानकारी वापस आती है।

यदि वह लिंक टेम्पलेट पिछले अनुरोध में प्रदान किया गया है, तो बैंड से बाहर की कोई जानकारी नहीं है। उदाहरण के लिए एक HTML खोज प्रपत्र एक HTML ( /search?q=hateoas ) उत्पन्न करने के लिए लिंक templating ( /search?q=%@ ) का उपयोग करता है, लेकिन HTML फॉर्म का उपयोग करने के अलावा क्लाइंट (वेब ​​ब्राउज़र) द्वारा कुछ भी ज्ञात नहीं है और GET


मुझे लगता है कि हेटोआस के बारे में महत्वपूर्ण बात यह नहीं है कि यह कुछ पवित्र अंगूर क्लाइंट-साइड है, लेकिन यह क्लाइंट को यूआरआई परिवर्तनों से अलग करता है - ऐसा माना जाता है कि आप ज्ञात (या डेवलपर खोजे गए कस्टम) लिंक संबंधों का उपयोग कर रहे हैं जो सिस्टम को अनुमति देगा पता है कि किसी ऑब्जेक्ट के लिए कौन सा लिंक संपादन योग्य रूप है। महत्वपूर्ण बिंदु एक एम्डिया प्रकार का उपयोग करना है जो हाइपरमीडिया जागरूक है (उदाहरण के लिए एचटीएमएल, एक्सएचटीएमएल, आदि)।







hateoas