क्लाइंट-साइड पर HATEOAS के साथ क्या बात है?


35

जैसा कि मैं वर्तमान में समझता हूं कि HATEOAS मूल रूप से प्रत्येक प्रतिक्रिया लिंक के साथ एक साथ भेजने के बारे में जानकारी है कि आगे क्या करना है। एक सरल उदाहरण इंटरनेट पर आसानी से मिल जाता है: एक बैंकिंग प्रणाली जिसमें एक खाता संसाधन होता है। खाता संसाधन के लिए GET अनुरोध के बाद उदाहरण इस प्रतिक्रिया को दिखाता है

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>

डेटा के साथ मिलकर लिंक बता रहे हैं कि आगे क्या किया जा सकता है। अगर संतुलन नकारात्मक है तो हमारे पास है

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>

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

हालाँकि, मुद्दा यह है कि जब हम एक क्लाइंट बनाते हैं, जैसे कि जावास्क्रिप्ट के साथ एक एसपीए, या एक एंड्रॉइड ऐप या कई अन्य चीजें, मैं यह नहीं देख सकता कि हेटोस प्रासंगिक कैसे बना रहा है। मेरा मतलब है कि निम्नलिखित है: जब मैं स्पा को जावास्क्रिप्ट में कोड कर रहा हूं, तो मुझे पता होना चाहिए कि कोड लिखने के लिए एपीआई में क्या किया जा सकता है।

इसलिए मुझे संसाधनों, समर्थित विधियों, जो वे प्राप्त करने की अपेक्षा करते हैं और जो वे वापस देने के लिए सर्वर को अजाक्स कॉल लिखने के लिए और यहां तक ​​कि यूआई बनाने के लिए भी जानने की आवश्यकता है। जब मैं UI का निर्माण करता हूं, तो मुझे पता होना चाहिए कि खाता का अनुरोध करने के बाद, उदाहरण के लिए इसमें जमा किया जा सकता है, या मैं UI पर यह विकल्प प्रदान नहीं कर पाऊंगा। इसके अलावा, मुझे ajax कॉल बनाने के लिए जमा करने के लिए URI को जानना होगा।

मेरा क्या मतलब है, जब हम एपीआई के लिए अनुरोध करते हैं, तो लिंक हमें एपीआई को बेहतर ढंग से खोजने और उपयोग करने की अनुमति देता है, लेकिन जब हम एक ग्राहक का निर्माण करते हैं, तो हम जिस एप्लिकेशन का निर्माण कर रहे हैं, वह केवल लिंक को नहीं देखेगा और फिर खुद को प्रस्तुत करेगा। सही UI और सही ajax कॉल करें।

तो, ग्राहकों के लिए HATEOAS कैसे महत्वपूर्ण है? हम वैसे भी HATEOAS से परेशान क्यों हैं?


1
आप सही हैं, लेकिन यह बात नहीं है। HATEOAS आपको क्लाइंट पर पेज में मौजूद लिंक के लिए URI का निर्माण करने से रोकता है।
जेम्स मैकलियोड

जवाबों:


24

जिस ऐप का हम निर्माण कर रहे हैं, वह केवल लिंक को नहीं देखेगा और उसके बाद ही सही यूआई को प्रस्तुत करेगा और सही ajax कॉल करेगा

वास्तव में, यह है कि वास्तव में क्या HATEOAS जाएगा यूआई दे। जो संभव है वह नहीं है, लेकिन जब यह संभव है। एचएएल जैसा एक औपचारिक HATEOAS , जैसा कि प्रश्न कहता है, लिंक देता है जो इंगित करता है कि क्या संभव है। लेकिन जब वे लिंक दिखाई देते हैं तो आवेदन की स्थिति पर निर्भर करता है। इसलिए, लिंक समय के साथ संसाधन पर बदल सकते हैं (पहले से प्रदर्शन किए गए कार्यों के आधार पर)।

यह एक यूआई कि सभी शामिल हैं का निर्माण करने की अनुमति देता है संभव राज्यों, लेकिन साथ संबंध नहीं किया जब उन राज्यों सक्रिय हो जाते हैं। उदाहरण के लिए, कैन की उपस्थिति rel="deposit"सीधे यूआई को बता सकती है जब make depositफॉर्म को प्रस्तुत करना ठीक है । जो तब उपयोगकर्ता को एक मूल्य दर्ज करने और लिंक का उपयोग करके सबमिट करने की अनुमति देता है।


2
इसलिए यूआई का निर्माण करते समय हमें अभी भी वह सब कुछ जानना होगा जो एपीआई प्रदान करता है, और फिर उन लिंक को देखकर हम सर्वर पर जानकारी को जानने में सक्षम हैं? उदाहरण के लिए, यूआई जानता है कि जमा करना, निकालना, स्थानांतरण या बंद करना संभव है (संभव रिले जानता है), तो यह जांचता है कि राज्य को देखने के लिए क्या वापस आया था?
user1620696

1
हाँ, यह कर सकता है। फिर से यह निर्भर करता है कि आप इसे कितना गतिशील बनाना चाहते हैं। जैसा कि दूसरों ने उल्लेख किया है, सर्वर पर लिंक बदलने की क्षमता (और ग्राहकों को नहीं तोड़ना) एक और फायदा है। और यह तब बहुत दिलचस्प हो जाता है जब आपके एपीआई में एक आईफोन, एंड्रॉइड, विंडोज फोन, मोबाइल वेब और वेब क्लाइंट होते हैं जो सभी इसका उपयोग करते हैं (यह उल्लेख नहीं करने के लिए कि क्या आपका एपीआई दूसरों के लिए क्लाइंट बनाने के लिए प्रकाशित हुआ है)।
डेविन ट्राटन

@ user1620696 आपको ग्राहक और सर्वर दोनों के माध्यम से वैसे भी यह सब पता होना चाहिए, यदि सामग्री का प्रकार समझ में आता है। सामग्री का प्रकार गूंगा xml या Json से बहुत अधिक है। आपके पास कुछ "बैंक डिपॉजिट" कंटेंट टाइप होना चाहिए, जिससे क्लाइंट समझ सके कि कैसे काम करना है
Cormac Mulhall

1
@Ik प्रतिक्रिया में लिंक कैसे प्रदान किए जाते हैं, इसके एक उदाहरण के लिए HAL पर एक नज़र डालें ।
डेविन ट्रिन

1
हाँ, आप अभी भी पीछे संगतता संगतता है। इसे url में वर्जन हैडर या वर्जन सहित हल किया जा सकता है। लेकिन, मैं कहूंगा कि आप सही तरीके से समझ रहे हैं।
डेविन ट्राटन

3

जैसा कि मैं वर्तमान में समझता हूं कि HATEOAS मूल रूप से प्रत्येक प्रतिक्रिया लिंक के साथ एक साथ भेजने के बारे में जानकारी है कि आगे क्या करना है

HATEOAS सिर्फ लिंक की तुलना में बहुत अधिक है। यह अनुप्रयोग राज्य के इंजन के रूप में "हाइपर मीडिया" है।

आपके विवरण में जो कुछ छूट गया है, वह सामग्री प्रकार है, क्लाइंट और सर्वर के बीच हाइपर मीडिया की औपचारिक परिभाषा।

HTML हाइपर मीडिया का एक उदाहरण है, और HATEOS काम क्यों करता है इसका एक उदाहरण है। HTML पेज ही एक ऐसा इंजन है जो क्लाइंट (यानी यूजर) को साइट के माध्यम से जाने की अनुमति देता है। एक ब्राउज़र जो उपयोगकर्ता को पूरी तरह से नेविगेट करने योग्य वेबसाइट के लिए HTML प्रस्तुत करने की क्षमता रखता है। यह केवल यह नहीं है कि यह अन्य पृष्ठों के लिंक को पारित करता है, लेकिन यह उन्हें सार्थक तरीके से जोड़ता है जो लिंक के संदर्भ में और एक फैशन में है जो ब्राउज़र को एक नेविगेट करने योग्य साइट बनाने की अनुमति देता है।

और सबसे महत्वपूर्ण बात यह है कि ब्राउज़र स्वयं वेबसाइट की ZERO अप फ्रंट समझ के साथ ऐसा कर सकता है। ब्राउज़र केवल HTTP और HTML जानता है। उस सरल समझ के आधार पर यह उपयोगकर्ता को नेविगेट करने के लिए न्यूयॉर्क टाइम्स को प्रस्तुत कर सकता है।

भले ही यह "उपयोगकर्ता" एक और कंप्यूटर प्रोग्राम है। हाइपर मीडिया को स्वयं नेविगेशन के संदर्भ को परिभाषित करना चाहिए।


1
क्या इसका मतलब यह नहीं होगा कि आपको ब्राउज़र के रूप में एक क्लाइंट (और बग प्रोन) को जटिल बनाना होगा? लचीलापन अक्सर एक लागत के रूप में जटिलता के साथ आता है ...
एंड्रेस एफ।

@AndresF। इसका मतलब यह नहीं है कि आपको ऐसा करना चाहिए या ऐसा करना चाहिए , यह केवल आपको गतिशील रूप से ऐसा करने का विकल्प देता है यदि आप चाहते हैं या इसकी आवश्यकता है।
पीटरिस

2
@ माइक ज़रूर। मेरे सिर के ऊपर से कल्पना करें कि आपके पास एक सेवा है जो आराम से एपी के माध्यम से पैतृक जानकारी प्रदान करती है। आपके पास एक सामग्री प्रकार है जो एक 'व्यक्ति' संसाधन के प्रारूप को परिभाषित करता है, जिसमें उनके बारे में विभिन्न जानकारी होती है, लेकिन यह भी परिभाषित करता है कि रिश्ते क्या दिखते हैं, जैसे कि 'भाई' या 'बहन' या 'माँ' आदि। क्योंकि यह हाइपरमीडिया है बस किसी अन्य व्यक्ति संसाधन के लिए एक URI है। HTTP क्रियाओं का उपयोग करते हुए और इस 'व्यक्ति' सामग्री प्रकार को समझने वाला एक बहुत ही सरल क्लाइंट इस API के माध्यम से नेविगेट कर सकता है। कहते हैं कि आप किसी विशेष व्यक्ति के सभी प्रत्यक्ष वंशज खोजना चाहते हैं।
कोरमेक मुलहाल

2
@ इस क्लाइंट को केवल उस संसाधन के सामग्री प्रकार को समझने की आवश्यकता है जिसे उसने एक्सेस किया है और HTTP वर्ब्स (GET, PUT, DELETE आदि) और आप इस API के माध्यम से नेविगेट कर सकते हैं और संसाधनों को अपडेट कर सकते हैं। और, इससे भी महत्वपूर्ण बात यह है कि कोई भी क्लाइंट जो सामग्री प्रकार को समझता है, वह URI के माध्यम से, किसी अन्य सर्वर पर पूरी तरह से कूद सकता है और जारी रख सकता है। वे परवाह नहीं करते हैं कि वे किस सर्वर से बात कर रहे हैं, वे केवल संसाधन के सामग्री प्रकार के बारे में परवाह करते हैं, क्या वे इसे समझते हैं या नहीं।
कोरमेक मुलहॉल

1
@ नाइक तो ऐसी स्थिति में आपके पास एक सर्वर होता है जो मूल सामग्री प्रकार (व्यक्ति v1 कहे) और नए सामग्री प्रकार (व्यक्ति v2) को समझता है। क्लाइंट केवल व्यक्ति v1 को समझता है। क्लाइंट सर्वर को बताता है कि यह HTTP में हेडर के माध्यम से किस प्रकार की सामग्री को समझता है। सामग्री बातचीत का उपयोग करते हुए सर्वर निर्धारित करता है कि क्या वह ग्राहक को भेजेगा जो इस बात का समर्थन करता है कि किस मामले में वह सामग्री प्रकार व्यक्ति v1 का उपयोग करके संसाधन को लौटाएगा। अब आप इस पुरानी सामग्री प्रकार का समर्थन करना बंद कर सकते हैं और ग्राहक को 406 त्रुटि भेज सकते हैं। जितना संभव हो उतना प्रयास करना और समर्थन करना बेहतर है।
कॉर्मैक मुल्हेल

2

आपको डायनामिकली जेनरेट किए गए इंटरफ़ेस का निर्माण नहीं करना है। हालांकि यह अच्छा हो सकता है इसकी आवश्यकता नहीं है। यदि आप एक गतिशील इंटरफ़ेस नहीं बना सकते हैं तो केवल लिंक का उपयोग करें और आप कर रहे हैं। नुकसान यह है कि आप फिर से बैकएंड से जुड़े हुए हैं और अगर कुछ बदलता है तो दुर्घटनाग्रस्त हो जाएगा।

गतिशील लेआउट का उपयोग करना काफी सरल btw हो सकता है:

links.forEach(function(link) {

  switch(link.rel) {

    case 'deposit':
      showDepositButton();
      break;

    case 'withdraw':
      loadWithdrawForm(link.href);
      showWithdrawButton();
      break;
  }

});

यह आपको अपने ग्राहक कोड में बचाता है जैसे:

if (balance <= 0 && negativeBalanceAllowed === false) {
  showWithdrawButton();
}

आप अपने ग्राहक को बदले बिना एक अनुमत नकारात्मक स्थिति (उदाहरण के लिए पैसे उधार लेकर) को लागू कर सकते हैं।


एक छोटे से मजबूत उदाहरण के रूप में, बैंक अपने खातों पर परिवर्तनशील ओवरड्राफ्ट सीमा की पेशकश कर सकते हैं, बिना ग्राहक को यह बताए कि प्रत्येक खाते पर सीमा क्या है।
बार्ट वैन इनगेन शेनॉ

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

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