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


79

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

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

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

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

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


2
अपने विकल्पों के संदर्भ में बस थोड़ा सा हट कर। आप विकल्प अनुरोध के बाहर अनुमत संसाधन संचालन को संप्रेषित करने के लिए 'अनुमति दें' शीर्ष लेख का उपयोग कर सकते हैं। रॉय फील्डिंग हेडर को हाइपरटेक्स्ट के एक रूप के रूप में देखते हुए आगे बढ़ती है - यहाँ देखें ।
पौलकोरमोर

t8 एक gr8 प्रश्न, प्रमुख मुद्दों को लागू विधियों की सूची दी गई है, क्या ग्राहक को नियमित CRUD ऑपरेशन के लिए यूआरएल बनाने में सक्षम होना चाहिए या इसे "आउट-ऑफ-बैंड" कहा जाएगा? कहो, अगर हम CRUD के संचालन के लिए लिंक प्रदान करते हैं, तो आप json में "फ़ॉर्म" कैसे करते हैं? हो सकता है कि यदि एप्लिकेशन विशिष्ट मीडिया प्रकारों का उपयोग करते हुए आपको "फ़ॉर्म" करने की आवश्यकता न हो, लेकिन वाट मीडिया-प्रकार (यानी json स्कीमा) की खोज का मानक तरीका है, तो क्या स्कीमा की खोज की प्रक्रिया को "आउट-ऑफ" नहीं माना जाएगा? बैंड "ग्राहकों के लिए ??
Redzedi

एक्सएचटीएमएल कितना अच्छा और तरल दिखता है, लेकिन अगर आपको json करना है, तो मुझे लगता है कि अब अनाकार नहीं है
redzedi

जवाबों:


19

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

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

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

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


क्या हमारे स्वयं के एपीआई के लिए इस तरह की खोज सेवा को लागू करने के लिए कोई भी standart है?
21ağatay Gürtürk

12

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

आम आदमी की शर्तों में, HATEOAS का अर्थ है निम्नलिखित लिंक। यह दृष्टिकोण आपके क्लाइंट को विशिष्ट URL से डिकॉय करता है और आपको बिना किसी को तोड़े अपना एपीआई बदलने की सुविधा देता है।


6

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

UDDI रनटाइम डिस्कवरी की एक मार्मिक कहानी बताता है: http://en.wikipedia.org/wiki/Universal_Description_Discovery_and_Integration


4

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

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

क्या यह HATEOAS का अंत है और इस प्रकार REST का अंत है? हाँ और नहीं

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

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

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

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


1

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


0

तुम लिखो:

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

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


वास्तव में कोई बाहर की सूचना नहीं है - ग्राहक आपूर्ति संसाधन / इंस्टेंस डेटा (और यह कैसे करना चाहिए पता होना चाहिए) का उपयोग करके uri टेम्पलेट्स का विस्तार करने के लिए जिम्मेदार है - json-schema.org/latest/json-schema hypermedia.html # anchor18
fusi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.