2011-06-22 10 views
12

मुझे अपनी सादगी के लिए रीस्टफुल पसंद है और यह एसओएपी, या डीसीओएम और आरपीसी की बाइनरी-कठोरता जैसे सामान्य 'एंटरप्राइज़' सिस्टमों के क्रूर से कैसे बचाता है।विश्वसनीय क्रियाएँ/सेवाएं जो किसी इकाई से मेल नहीं खाती हैं?

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

उदाहरण के लिए, मान लीजिए कि मेरे पास सामान्य डेटाबेस सिस्टम (कहें, एक डेयरी शॉपिंग साइट) के लिए एक शानदार वेब सेवा है, तो मैं चाहता हूं है/उत्पादों/अंडे/बैटरी और/उत्पादों/दूध/स्किम्ड

आईएनएसईआरटी करना/उत्पादों/अंडों को पोस्ट करके हासिल किया जाएगा।

लेकिन आप "सभी को साफ़ करें" आदेश कैसे करेंगे? DELETE क्रिया केवल एकल इकाइयों के लिए उपयुक्त है। और "डिलीट/उत्पाद/दूध" का मतलब दूध श्रेणी के भीतर केवल सभी उत्पादों की बजाय "दूध" उत्पाद श्रेणी को हटाने का तात्पर्य है। और क्या होगा यदि आप दोनों को पूरा करना चाहते हैं?

एक अन्य प्रश्न जो मैंने वेब-सेवा क्रियाओं से संबंधित है जो किसी इकाई से संबंधित नहीं हैं। उदाहरण के लिए, यदि मैं पासवर्ड डेटाबेस के लिए वेब-सेवा डिज़ाइन कर रहा हूं, तो मेरे पास "GET /passwords/stackoverflow.com" जैसे ऑपरेशन होंगे जो ठीक है, लेकिन घुसपैठ के मामले में वेबसाइट को अक्षम करने के लिए मेरे पास ऑपरेशन भी होंगे का पता लगाने। 'पुराने स्कूल' वेब-सेवा मॉडल के तहत मेरे पास "अक्षम वेबसाइट" नामक एक विधि होगी, हालांकि मैं "अक्षम" नामक एक HTTP क्रिया और "/ वेबसाइट" नामक संसाधन नहीं बना सकता (इसलिए अनुरोध " अक्षम/वेबसाइट ")। यहां समाधान क्या है?

अंत में, आप HTML फॉर्म को रीस्टफुल के साथ कैसे मेल खाते हैं? वेब फॉर्म केवल क्वेरीस्ट्रिंग या POST का उपयोग करके अनुरोध प्राप्त कर सकते हैं। अगर मेरे पास एक खोज फ़ॉर्म है, तो मैं इसे "/ products/search/{query}" का अनुरोध करना चाहता हूं लेकिन अभी अनुरोध "/ products/search? Query = {query}" जैसा दिखता है।

उत्तर

5

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

लेकिन आप "सभी को साफ़ करें" आदेश कैसे करेंगे?

मुझे यकीन है कि क्यों हटाएँ/उत्पादों/दूध दूध श्रेणी खुद का विलोपन का तात्पर्य नहीं कर रहा हूँ, लेकिन अगर आप बल्कि चाहते हैं:

DELETE /products?category=milk 

हटाएं एकल का विलोपन संकेत नहीं करता है डेटाबेस इकाई।यह एक संसाधन का विलोपन का तात्पर्य है। और "/ उत्पादों? श्रेणी = दूध" (या "/ उत्पादों/दूध", उस मामले के लिए) एक एकल संसाधन की पहचान करता है। यदि आप इसे प्राप्त कर सकते हैं, तो आप इसे हटा सकते हैं।

और यदि आप दोनों को पूरा करना चाहते हैं तो क्या होगा?

इस बारे में कैसे?

DELETE /product-categories/milk 

एक चाल है कि पर रूबी के साथ लोकप्रिय हो गया एक रूप (का उपयोग कर जीईटी) किसी भी PUT/पोस्ट/हटाएँ ऑपरेशन के लिए प्रदान करना है। तो, इन हटाए गए के लिए, अगर आप इस तरह एक रूप प्रदान कर सकते हैं:।

GET /product-categories/milk/delete 

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

हम कैसे अक्षम करें bsite?

ऐसा करने के कई तरीके हैं। अक्षम करने के लिए ध्वज के साथ /sites/stackoverflow.com पर बस एक पुट काम कर सकता है।

अंत में, आप HTML फॉर्म को रीस्टफुल के साथ कैसे जोड़ते हैं?

आप वास्तव में एक HTTP PUT नहीं कर सकते या ब्राउज़र से हटा, लेकिन आप नकली यह करने के लिए अपने रूप में एक छिपी हुई फ़ील्ड प्रदान कर सकते हैं: जब तक अपने मार्ग इंजन इसका समर्थन करता है के रूप में

<input type="hidden" name="_method" value="PUT" /> 

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

यदि आप खोदने में रुचि रखते हैं, तो मैं स्टार्टर के रूप में Web Services Cookbook की अनुशंसा करता हूं। इसके अलावा, Richardson Maturity Model पर एक नज़र डालें। और याद रखें कि आरईएसटी बाकी वेब की तरह है। यह लिंक के बिना बहुत उपयोगी नहीं होगा। अपने ग्राहकों को चारों ओर जाने के तरीके के साथ प्रदान करें।

<a href="/products/milk/delete" rel="delete" /> 

<atom:link href="/products/milk/delete" rel="delete" /> 
+0

शानदार उत्तर! लेकिन 'जीईटी/उत्पाद-श्रेणियों/दूध/हटाने' का उपयोग करना वास्तव में एक अच्छा समाधान नहीं है, क्योंकि जीईटी एक सहेजने की विधि है और "पुनर्प्राप्ति के अलावा कोई कार्रवाई करने का महत्व नहीं होना चाहिए" [लिंक] देखें (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)। मैं POST/product-category/milk/deletecategory' जैसे कुछ पोस्ट का उपयोग करने की अनुशंसा करता हूं। इस तरह ट्विटर अपने एपीआई के साथ बहुत सी चीजें संभालता है। – Robert

+0

जीईटी एक फॉर्म पुनर्प्राप्त करना है, वास्तव में हटाने के लिए नहीं। –

2

लेकिन आप "सभी को साफ़ करें" आदेश कैसे करेंगे? DELETE क्रिया केवल एकल इकाइयों के लिए उपयुक्त है।

झूठा।

और "डेले/उत्पाद/दूध" का मतलब दूध श्रेणी के भीतर केवल सभी उत्पादों की बजाय "दूध" उत्पाद श्रेणी को हटाने का तात्पर्य है।

सही।

और यदि आप दोनों को पूरा करना चाहते हैं तो क्या होगा?

/cart/milk/ पर DELETE के साथ क्या गलत है?

'पुराने स्कूल' वेब सेवा मॉडल मैं एक विधि बस "disableWebsite" नाम होगा के तहत,

क्या?

हालांकि मैं "अक्षम" नामक एक HTTP क्रिया और "/ वेबसाइट" नामक संसाधन नहीं बना सकता (इसलिए अनुरोध "अक्षम/वेबसाइट" होगा)। यहां समाधान क्या है?

पोस्ट।/passwords/stackoverflow.com/disable/ पर पोस्ट करें इकाई (passwords/stackoverflow.com) इसमें "अक्षम" और "सक्षम" उप-इकाई शामिल है। आप मूल इकाई की स्थिति को बदलने के लिए किसी एक को पोस्ट कर सकते हैं।

अगर मैं मैं यह अनुरोध करना चाहते हैं एक खोज फॉर्म "/ उत्पादों/खोज/{query}"

कारण है कि अधिकांश RESTful वेब सेवाओं जावास्क्रिप्ट या फ्लेक्स या ऐसा ही कुछ में लिखे गए हैं है कि है।

विश्वसनीय वेब सेवाएं और "मूल" HTML रूप वास्तव में संगत नहीं हैं। वे होने के लिए नहीं हैं।

4

रीस्टफुल सिस्टम "संसाधन" के साथ बातचीत करते हैं जो किसी इकाई की मानक धारणा से संबंधित नहीं हैं।
कुछ "सख्त" कुछ सख्त नियमों के साथ एक "संसाधन" एक बहुत अस्पष्ट अवधारणा है। मुझे संसाधन के बारे में सोचना पसंद है क्योंकि कोई उपयोगी अवधारणा है जो क्लाइंट को ऐसा करने की अनुमति देने में मदद कर सकती है जो उन्हें करने की ज़रूरत है। इसलिए, यदि आपको इकाइयों का एक समूह हटाना है, तो एक संसाधन बनाएं जो "इकाइयों का समूह" का प्रतिनिधित्व करता है और फिर उस पर DELETE विधि का उपयोग करता है।

आरामदायक सिस्टम को डिजाइन करने की वास्तविक चाल विशेष संसाधनों को महत्व देने की कोशिश करना बंद करना है, लेकिन दो संसाधनों के बीच संबंधों को महत्व देते हैं। एचटीएमएल कैसे काम करता है इसके बारे में सोचें। आप एक पेज डाउनलोड करते हैं, और एक स्टाइलशीट लिंक है। Rel = "स्टाइलशीट" href URL के अंत में आपको जो मिलता है उसका अर्थ परिभाषित करता है।
यदि आप किसी वेबसाइट को अक्षम करना चाहते हैं, तो वेबसाइट संसाधन तक पहुंचें और URL = URL के साथ लिंक में मौजूद URL का उपयोग करें। रीस्टफुल डिज़ाइन उन संसाधनों को परिभाषित करने के बारे में है जो लिंक के माध्यम से जुड़े हुए हैं। कुछ लिंक केवल जानकारी की पुनर्प्राप्ति के लिए उपयोग किए जाते हैं, अन्य वास्तव में संसाधन स्थिति में परिवर्तन करने के लिए उपयोग किए जाते हैं।

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

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

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

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