2012-02-08 14 views
41

मैं HATEOAS का एक स्पष्ट और संक्षिप्त समझ पाने के लिए कोशिश कर रहा हूँ, और मैं किसी भी तरह से कर रहा हूँ एक विशेषज्ञ WRT बाकी (मुझे लगता है कि मैं इसे हालांकि मिलता है, धन्यवाद इस http://tomayko.com/writings/rest-to-my-wife करने के लिए)HATEOAS: संक्षिप्त विवरण

किसी को भी बता सकते हैं इसका मतलब है एक समान रूप से enlighenting ब्लॉग/लेख WRT HATEOAS?

+4

मैं आपको "अभ्यास में आरईएसटी" पुस्तक पढ़ने का सुझाव दूंगा। –

+0

बढ़िया, धन्यवाद। –

+0

लघु, मीठा और पूर्ण: REBST के लिए https://blogs.oracle.com/craigmcc/entry/why_hateoas – realPK

उत्तर

56

हाइपरमीडिया कन्स्ट्रेंट (जिसे पहले हेटोएस के नाम से जाना जाता था) एक बाधा है जिसका उपयोग उपयोगकर्ता-एजेंट को दिशा प्रदान करने के लिए किया जाता है।

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

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

हाइपरमीडिया बाधा के अनुरूप एक उपयोगकर्ता-एजेंट एक राज्य मशीन की तरह कार्य करता है, जहां राज्य संक्रमण वर्तमान प्रतिनिधित्व में उपलब्ध लिंक के कारण होते हैं। लौटा प्रतिनिधित्व नया राज्य बन जाता है।

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

के लिए यह उदाहरण कैसे काम करता है उदाहरण के लिए, आपको अपने वेब ब्राउज़र और वेब साइट से आगे की आवश्यकता नहीं है जो जावास्क्रिप्ट का उपयोग नहीं करता है। ब्राउज़र आपको HTML में लिंक के आधार पर विकल्पों के साथ प्रस्तुत करता है। जब आप उस लिंक का पालन करते हैं, तो ब्राउज़र आपके वर्तमान स्थिति को नए राज्य के साथ बदल देता है जब आप लिंक का पालन करते हैं। बैक बटन काम करता है (या कम से कम चाहिए) क्योंकि आप अपने इतिहास के लिंक से राज्य को पुनः प्राप्त कर रहे हैं। ब्राउजर को इस बात पर ध्यान नहीं देना चाहिए कि आप पेज पर कैसे पहुंचे, क्योंकि राज्य पूरी तरह से पुनर्प्राप्त प्रतिनिधित्व पर आधारित होना चाहिए।

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

+0

अच्छा जवाब, धन्यवाद। मैं आपके उत्तर को पूरी तरह से समझने से पहले निश्चित रूप से कुछ पढ़ना चाहता हूं। क्या आप ऑनलाइन उपलब्ध कुछ भी सुझा सकते हैं? –

+3

@MylesMcDonnell माइक अमुंडसेन में कुछ पोस्ट हैं जो विषय को कवर करती हैं http://www.amundsen.com/blog/archives/?category=22 –

+1

माइक के एप्लिकेशन/एचटीएमएल प्रतिनिधित्व के लिए हाइपरलिंक के लिए धन्यवाद, यह निश्चित रूप से मेरे आवेदन स्थिति को बदल गया ! – HDave

40

कुछ शब्दों में HATEOAS: आपके द्वारा उत्पादित डेटा में, यूआरआई का उपयोग करके अन्य संसाधनों का संदर्भ लें, आईडी नहीं।

सभी छोटी परिभाषाओं के रूप में, मैंने जो परिभाषा दी है, वह कई स्तरों पर गलत है, लेकिन यह आपको समझने में मदद करनी चाहिए कि हैटियोस का क्रूक्स क्या है।

अब, थोड़ी देर की व्याख्या के लिए।

हैटओएएस सिद्धांत कहता है कि आपके आवेदन की स्थिति हाइपरटेक्स्ट लिंक के माध्यम से आगे बढ़नी चाहिए। इंटरनेट के चारों ओर ब्राउज़ करने के बारे में सोचें। सबसे पहले आपको पता बार में एक पता टाइप करना होगा। उस बिंदु से, आपकी नेविगेशन बहुत अधिक लिंक पर क्लिक के लिए बहुत ही धन्यवाद देती है: आप एक लिंक पर क्लिक करते हैं और आप दूसरे पृष्ठ पर समाप्त होते हैं। एक और क्लिक और यहां एक और पेज दिखाई देता है। ब्राउज़र आपको पहले पृष्ठ से दूसरे स्थान पर तीसरे स्थान पर ले जाने में सक्षम कैसे था? इसने <a> तत्वों में एन्कोड किए गए यूआरएल का इस्तेमाल किया।

इसी प्रकार यदि अपने बाकी एप्लिकेशन इसका परिणाम

<accomodation> 
    <hotel info="http://example/hotel/0928374" price="200"/> 
    <guest-house info="http://example/guest-h/7082" price="87"/> 
</accomodation> 

तो प्राप्त आवेदन को पता है कि पहला होटल http://example/hotel/0928374 पर उपलब्ध है और http://example/guest-h/7082 पर एक दूसरे के ज्ञान के किसी भी बाहरी स्रोतों का उपयोग करने के लिए नहीं होगा उत्पन्न करता है।

दूसरी ओर, यदि आपके आवेदन की तरह

<accomodation> 
    <hotel id="0928374" price="200"/> 
    <guest-house id="7082" price="87"/> 
</accomodation> 

आईडी से प्रतिक्रियाएं उत्पन्न प्राप्त आवेदन पहले से पता करने के लिए कैसे आईडी उपसर्गों यूआरआई पाने के लिए के साथ बना दिया जाना चाहिए होगा जो प्रत्येक के लिए जानकारी पर आवास उपलब्ध है (उदाहरण के लिए "प्रत्येक अनुरोध के लिए http://example/ जोड़ें, फिर hotel होटल के लिए guest-h अतिथि घरों के लिए) जोड़ें। आप देख सकते हैं कि यह तंत्र कई डीबी अनुप्रयोगों में जो होता है उसके समान होता है लेकिन ब्राउजर कैसे काम करता है उससे अलग है।

हेटओएएस सिद्धांत का पालन करना महत्वपूर्ण है क्योंकि यह प्राप्त करने वाले अनुप्रयोगों में कठोर परिवर्तन किए बिना अनुप्रयोगों को विकसित करने की अनुमति देता है। मान लीजिए कि आप अपने यूआरआई को http://example.com/hotel/0928374 से https://reviews.example.com/accommodation/0928374 में बदलना चाहते हैं। यदि आप हेटोएस का पालन करते हैं तो यह एक साधारण परिवर्तन होगा: लौटाए गए मानों को संशोधित करें और यह है कि: आवेदन प्राप्त करना बिना किसी संशोधन के काम करना जारी रखेगा। यदि इसके बजाय आपके पास यूआरआई बनाने के लिए अलग-अलग दस्तावेज थे, तो आपको सभी एप्लिकेशन डेवलपर्स से संपर्क करना होगा और उन्हें यह नोटिस करना होगा कि दस्तावेज अपडेट कर दिए गए हैं और उन्हें परिवर्तनों को दर्शाने के लिए अपना कोड बदलना चाहिए।

अस्वीकरण: यह एक त्वरित उत्तर है जो समस्या की सतह को खरोंच करता है। लेकिन अगर आपको यह मिलता है तो आपको 80% हेटोएस सिद्धांत मिला है।

+1

अच्छा। मैंने संकेत दिया कि हाइपरमीडिया मेरे जवाब में प्रदान करता है, इसलिए मुझे लगता है कि हमारे उत्तर एक-दूसरे के पूरक हैं। –

+0

ग्रेट, इसे लिखने के लिए समय निकालने के लिए धन्यवाद। मुझे यह सुझाव दिया गया है कि हेटोआस में निहित समस्या है (यह नौकरी की कल्पना पर है। मैं आवेदन करने पर विचार कर रहा हूं), क्या आप में से कोई भी जानता है कि यह क्या हो सकता है? –

+1

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

3

REST & के साथ एक समस्या हैटओएएस इंटरफ़ेस परिभाषा पर दृश्यता और नियंत्रण की कठिनाई और कमी है। अधिक पारंपरिक आरपीसी शैली की बातचीत के साथ आम तौर पर एक आर्टफैक्ट होता था जैसे आईडीएल या डब्ल्यूएसडीएल जो एपीआई को परिभाषित करता था और परियोजना द्वारा नियंत्रित और प्रबंधित किया जा सकता था।

एक हेटोएस के साथ एपीआई गतिशील रूप से वांछनीय है और इसे व्यवहार (राज्य परिवर्तन) के सेट के रूप में वर्णित किया जा सकता है। कोड में व्यवहार का वर्णन किया गया है। इंटरफ़ेस विवरण से उत्पन्न कोड के बजाय कोड से एपीआई विवरण (WADL) उत्पन्न होता है।

2

हैटओएएस इंजन के साथ काम करने के अपने व्यक्तिगत अनुभव से, सबसे बड़ा अंतर डिजाइन का दर्शन है।

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

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

जबकि आरईएसटी शैली में, कोई आरपीसी नहीं है। क्लाइंट और सर्वर के बीच बातचीत क्या मायने रखती है। राज्य के किसी भी संक्रमण के लिए, ग्राहक को जानकारी प्राप्त करने के लिए सर्वर से बातचीत करना पड़ता है। तय की गई एकमात्र बातचीत घर पर बातचीत है। बाकी सभी क्लाइंट द्वारा खोजे जाते हैं क्योंकि यह विभिन्न इंटरैक्शन के माध्यम से जाता है।

कंप्यूटर विज्ञान परिप्रेक्ष्य से, एक प्रक्रियात्मक शैली है और यह एल्गोरिदमिक है। जहां आरईएसटी शैली एक पारस्परिक प्रतिमान है। कोई भी प्रणाली जो भाषा के रूप में पारस्परिक प्रतिमान को गोद लेती है वह एक हेटोएस प्रणाली प्रदान करेगी।

2

इस आलेख ने मुझे इसे पूरी तरह समझने में मदद की। http://restcookbook.com/Basics/hateoas/

यह आसान और सुरुचिपूर्ण है।

हैटओएएस हाइपरटेक्स्ट अनुप्रयोग राज्य के इंजन के रूप में है। इसका मतलब है कि एपीआई के माध्यम से अपना रास्ता खोजने के लिए हाइपरटेक्स्ट का उपयोग किया जाना चाहिए। एक उदाहरण: तथ्य यह है कि हम अपने खाते में 100 डॉलर (अमेरिका) है से

GET /account/12345 HTTP/1.1 

HTTP/1.1 200 OK 
<?xml version="1.0"?> 
<account> 
    <account_number>12345</account_number> 
    <balance currency="usd">100.00</balance> 
    <link rel="deposit" href="/account/12345/deposit" /> 
    <link rel="withdraw" href="/account/12345/withdraw" /> 
    <link rel="transfer" href="/account/12345/transfer" /> 
    <link rel="close" href="/account/12345/close" /> 
</account> 

अलावा, हम 4 विकल्पों में देख सकते हैं: अधिक पैसे जमा, पैसे निकालने, एक और खाते में धन स्थानांतरित, या हमारे खाता बंद। "लिंक" -टैग हमें निर्दिष्ट क्रियाओं के लिए आवश्यक यूआरएल खोजने की अनुमति देता है। अब, मान लेते हैं कि हम बैंक में 100 अमरीकी डालर नहीं था, लेकिन हम वास्तव में लाल रंग में हैं:

GET /account/12345 HTTP/1.1 

HTTP/1.1 200 OK 
<?xml version="1.0"?> 
<account> 
    <account_number>12345</account_number> 
    <balance currency="usd">-25.00</balance> 
    <link rel="deposit" href="/account/12345/deposit" /> 
</account> 

अब हम लाल रंग में 25 डॉलर है। क्या आप देखते हैं कि अभी हमने अपने कई विकल्पों को खो दिया है, और केवल धन जमा करना वैध है? जब तक हम लाल रंग में हों, हम अपने खाते को बंद नहीं कर सकते, न ही खाते से किसी भी धन को स्थानांतरित या वापस ले सकते हैं। हाइपरटेक्स्ट वास्तव में हमें बता रहा है कि क्या अनुमति है और क्या नहीं: HATEOAS

संबंधित मुद्दे