2012-07-02 16 views
16

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

समझाने के लिए, मैं Rest In Practice किताब से उदाहरण लेते एक कॉफी आदेश बनाने के बारे में: -

<order xmlns="http://schemas.restbucks.com"> 
    <location>takeAway</location> 
    <item> 
    <name>latte</name> 
    <quantity>1</quantity> 
    <milk>whole</milk> 
    <size>small</size> 
    </item> 
    <cost>2.0</cost> 
    <status>payment-expected</status> 
    <link rel="payment" href="https://restbucks.com/payment/1234" /> 
</order> 

मूलतः, यह उपभोक्ता भुगतान <link> टैग द्वारा परिभाषित करने के लिए अनुमति देता है। हालांकि, हकीकत में, उपभोक्ता को अभी भी उस वेब सेवा कॉल के सभी अर्थशास्त्रों को जानने की जरूरत है, उदाहरण के लिए, भुगतान करने के लिए पेलोड में कौन से अनुरोध पैरामीटर का उपयोग करना है, उदाहरण के लिए, किस विधि (POST या PUT) का उपयोग करना है। .. एक और शब्द में, उपभोक्ता को अभी भी WADL दस्तावेज़ों पर भरोसा करने की आवश्यकता है ताकि यह पता चल सके कि इस वेब सेवा को सफलतापूर्वक कैसे पहुंचाया जाए। ये टैग शायद अधिक समझ में आते हैं यदि वे सभी एक विशिष्ट आइटम पर जीईटी का उपयोग कर रहे हैं। अन्यथा, मुझे वास्तव में यहां लिंक को परिभाषित करने में बहुत अधिक लाभ नहीं दिख रहे हैं ... तथ्य यह है कि उपभोक्ता जानता है कि वे कौन से कदम अगली बार बुला सकते हैं, और उसके बाद WADL को यह निर्धारित करने के लिए देखें कि इसे सही तरीके से कैसे बुलाया जाए।

मेरी अगली चिंता सभी <link> टैग के साथ बहुत भारी पेलोड के साथ समाप्त होने की संभावना है। उदाहरण के लिए,/परियोजनाओं/1/उन पर किसी GET लौटाता है यदि सभी उपयोगकर्ता जानकारी है कि परियोजना 1 हैं, मुझे लगता है मैं निम्नलिखित टैग के साथ खत्म हो जाएगा: -

<project> 
    <users> 
     <user id="12" name="mike" ... /> 
     <user id="23" name="kurt" ... /> 
     <user id="65" name="corey" ... /> 
    </user> 
    <links> 
     <link rel="self" href="http://server/projects/1/users"/> 
     <link rel="create_user" href="http://server/projects/1/users"/> 

     <link rel="get_user_mike" href="http://server/projects/1/users/12"/> 
     <link rel="get_user_kurt" href="http://server/projects/1/users/23"/> 
     <link rel="get_user_corey" href="http://server/projects/1/users/65"/> 
     ... 
    </links> 
</project> 

एक परियोजना का कहना हैं, तो 500 उपयोगकर्ता ... क्या मेरे पास पेलोड में 500 उपयोगकर्ता लिंक नहीं होंगे? अन्यथा, इस स्थिति को संभालने के लिए मेरी वेब सेवाओं को फिर से डिजाइन करने में सबसे अच्छा तरीका क्या है? या यह असली दुनिया में स्वीकार्य है?

किसी भी विचार या सुझाव की सराहना की जाती है। धन्यवाद।

उत्तर

9

यह सोचने के लिए कि यह सही काम क्यों है, अपने एपीआई को हैटओएएस दृष्टिकोण के बिना कल्पना करें: आपको अपने दस्तावेज़ में प्रत्येक संभावित यूआरआई योजना (या अपने WADL में, यदि यह आपकी बात है) प्रकाशित करना होगा, और उस बिंदु से आपके ग्राहकों को तोड़ने के बिना उन्हें नहीं बदल सकता है।

संक्षेप में, आपके ग्राहक यूआरआई लेआउट की आपकी पसंद के साथ अनजाने में होंगे। यह युग्मन का एक स्तर है कि आप आसानी से दस्तावेज करके आसानी से बच सकते हैं, जहां दस्तावेज करने के बजाय लिंक जैसे दस्तावेज़ों की तुलना में आपके मीडिया प्रकारों में हैं।

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

+6

+1 को देखना चाहेंगे ... आपकी प्रतिक्रिया के लिए धन्यवाद। मेरी राय में, वास्तव में WADL से कोई बच नहीं है कि क्या मैं हैटोज़ दृष्टिकोण को अपनाता हूं या नहीं, क्योंकि अंत में, मुझे अभी भी विधि उपयोग और सभी आवश्यक पैरामीटर (अनुरोध, शीर्षलेख इत्यादि) को दस्तावेज करने की आवश्यकता होगी, जिनकी मेरी आवश्यकता हो सकती है । जब आप एक दिन यूआरआई पैटर्न बदलते हैं तो क्लाइंट कोड तोड़ने के बारे में आपने एक अच्छा मुद्दा नहीं बनाया है, लेकिन अगर यह इस तथ्य को हल नहीं करता है कि क्लाइंट कोड अभी भी मेरे एपीआई के साथ सख्ती से जोड़ रहा है ... (जारी रखें) – limc

+1

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

+1

पोस्ट पैरामीटर परिवर्तनों के आपके उदाहरण में हैटॉस के साथ कुछ लेना देना नहीं है, हालांकि। हैटओएएस सर्वर से लौटाई गई पेलोड सामग्री के भीतर हाइपरलिंक्स के सही उपयोग को संदर्भित करता है, न कि आपके यूआरआई पैरामीटर के प्रारूप के लिए (जो स्पष्ट रूप से कहीं भी दस्तावेज किया जाना चाहिए और संगतता कारणों के लिए बनाए रखा जाना चाहिए)। –

5

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

कुछ आईडी या नामों के आधार पर यूआरएल बनाने के लिए ग्राहकों की अपेक्षा करना उपयोगकर्ता के ब्राउज़र बार में मैन्युअल रूप से यूआरएल टाइप करने के लिए कहने जैसा होगा।

यहाँ विशेष रूप से इस बारे में एक very good article है,:

वैसे ही जैसे HTML फ़ाइलों टैग के साथ एक दूसरे से लिंक है, या बस की तरह एक्सएमएल फाइल XLink के साथ एक दूसरे से लिंक, सभी राज्य हस्तांतरण किया जा सकता है केवल एक लिंक प्रतिनिधित्व

+2

+1 ... आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे आपसे यह पूछने दो, और देखें कि क्या आप यहां मेरे विचारों से सहमत हैं ... 'लिंक' टैग में 'rel' विशेषता बहुत अधिक स्थायी है। उपभोक्ता हमेशा गतिशील यूआरआई प्राप्त करने के लिए 'rel' विशेषता के आधार पर एक लुकअप करेगा। हालांकि, उपभोक्ता को अब भी पता होना चाहिए कि डब्ल्यूएडीएल या दस्तावेजों के किसी भी संदर्भ का जिक्र करते हुए गतिशील यूआरआई को कैसे बुलाया जाए। क्या यह सही लगता है? क्या शेष वेब सेवाओं से डब्ल्यूएडीएल के लिए एक लिंक शामिल करना आम बात है? – limc

+0

@limc नहीं, यह सही नहीं है। दस्तावेज़ प्रारूप का उपयोग करने के लिए http विधि का वर्णन करता है। पूर्ण विवरण के लिए मेरा जवाब देखें। –

0

उपयोगकर्ता 500 बात पर सिर्फ एक पक्ष बिंदु के अंदर पाया करने के लिए एक प्रतिक्रिया के रूप: मैं कोई विशेषज्ञ हूँ, लेकिन मेरी समझ है कि आप शांति से पृष्ठांकन प्रदान कर सकता है:

/परियोजना/1/उपयोगकर्ताओं/पृष्ठों/1

<links> 
    ... 
    <link rel="get_user_mike" href="http://server/projects/1/users/12"/> 
    <link rel="get_user_kurt" href="http://server/projects/1/users/23"/> 
    <link rel="get_user_corey" href="http://server/projects/1/users/65"/> 
    <link rel="get_page_2" href="http://server/projects/1/users/pages/2"/> 
</links> 
0

यह वास्तव में एक जवाब, बस HATEOAS गोद लेने के लिए कुछ सुझाव नहीं है। आपको सैकड़ों लिंक शामिल करने की आवश्यकता नहीं है, आप या तो 500 की पूरी सूची में 1 लिंक जोड़ सकते हैं, लिंक के पेजिनेटेड सबसेट के लिए 1 लिंक, या प्रतिक्रिया में एक पेजिनेटेड सबसेट शामिल कर सकते हैं और एक अगला पेज लिंक जोड़ सकते हैं।

WADL चीज़ के जवाब में, आपको अपनी सामग्री प्रारूप जो भी हो, अंतर्निहित सुविधाओं का उपयोग करना चाहिए, उदा। एचटीएमएल में LINK और A तत्वों को इंगित करने के लिए क्लाइंट को जीईटी अनुरोध करना चाहिए, और FORM POST अनुरोधों के लिए तत्व बनाना चाहिए। जाहिर है अन्य प्रारूप और एपीआई एक्सलिंक और XMLHTTPRequest समर्थन HTML से बेहतर HTTP करता है। आप http://tools.ietf.org/html/draft-nottingham-link-hint

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