2009-09-15 11 views
19

मेरे पास एक संसाधन है जिसमें काउंटर है। उदाहरण के लिए, के संसाधन प्रोफ़ाइल कॉल, और काउंटर विचारों उस प्रोफ़ाइल के लिए की संख्या है।एक विश्वसनीय तरीके से संसाधन काउंटर में वृद्धि: PUT बनाम पोस्ट

REST wiki प्रति, संसाधन अनुरोध या संशोधन के लिए पुट अनुरोधों का उपयोग किया जाना चाहिए, और बेवकूफ होना चाहिए। यह संयोजन ठीक है अगर मैं प्रोफ़ाइल का नाम अपडेट कर रहा हूं, कहूं, क्योंकि मैं एक पुट अनुरोध जारी कर सकता हूं जो नाम को 1000 बार सेट करता है और परिणाम नहीं बदलता है।

इन मानक PUT अनुरोधों के लिए, मैं एक ब्राउज़र की तरह कुछ करना है:

PUT /profiles/123?property=value&property2=value2 

एक काउंटर incrementing के लिए, एक तो जैसे यूआरएल कॉल:

PUT /profiles/123/?counter=views 

प्रत्येक कॉल काउंटर में परिणाम होगा बढ़ रहा है। तकनीकी रूप से यह एक अद्यतन ऑपरेशन है लेकिन यह idempotency का उल्लंघन करता है।

मैं मार्गदर्शन/सर्वोत्तम अभ्यास की तलाश में हूं। क्या आप इसे सिर्फ पोस्ट के रूप में कर रहे हैं?

उत्तर

8

प्रोफ़ाइल के दृश्यों को ट्रैक करने के लिए सिस्टम में एक और संसाधन जोड़ने का विकल्प हो सकता है। आप इसे "देखना" कह सकते हैं।

एक प्रोफाइल के सभी दृश्यों को देखने के लिए:

प्राप्त/प्रोफाइल/123/दृश्यों

एक प्रोफ़ाइल के लिए एक को देखने जोड़ने के लिए:

पोस्ट/प्रोफाइल/123/दृश्यों #here, आप अनुरोध निकाय में एक कस्टम मीडिया प्रकार का उपयोग कर विवरण जमा करें।

एक मौजूदा देखने को अद्यतन करने के लिए:

PUT/आपके द्वारा बनाए गए कस्टम मीडिया प्रकार का उपयोग कर अनुरोध शरीर में देखने के दृश्यों/815 # संशोधित सबमिट विशेषताओं।

एक को देखने के विवरण में प्रवेश करने की:

प्राप्त/दृश्यों/815

एक देखने हटाने के लिए: इसके अलावा

हटाएं/दृश्यों/815

, क्योंकि आप ' सर्वोत्तम अभ्यास के लिए पूछ रहे हैं, सुनिश्चित करें कि आपका रीस्टफुल सिस्टम hypertext-driven है।

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

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

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

आरईएसटी के बारे में सबसे कठिन हिस्सा यह समझ रहा है कि कैसे मीडिया प्रकार सिस्टम डिज़ाइन में आते हैं (यह वह हिस्सा भी है जो फ़ील्डिंग अपने शोध प्रबंध से बाहर निकलता है क्योंकि वह समय से बाहर भाग गया)। यदि आप हाइपरटेक्स्ट-संचालित सिस्टम का एक विशिष्ट उदाहरण चाहते हैं जो मीडिया प्रकारों का उपयोग करता है और डॉक्यूमेंट करता है, तो Sun Cloud API देखें।

+0

बस स्पष्ट करने के लिए:/व्यूइंग/815 प्रोफाइल के 815 वें देखने को संदर्भित करता है, हां? –

9

मुझे लगता है कि सही जवाब पैच का उपयोग करना है। मैं किसी और की सिफारिश यह atomically एक काउंटर बढ़ाने के लिए इस्तेमाल किया जाना चाहिए नहीं देखा था, लेकिन मेरा मानना ​​है कि RFC 2068 यह सब कहते हैं बहुत अच्छी तरह से:

PATCH विधि को छोड़कर इकाई का एक सूची है कि डाल करने के लिए इसी तरह की है अनुरोध-यूआरआई द्वारा पहचाने गए संसाधन के मूल संस्करण और पैच क्रिया लागू होने के बाद संसाधन की वांछित सामग्री के बीच अंतर। मतभेदों की सूची इकाई के मीडिया प्रकार (उदाहरण के लिए, "एप्लिकेशन/diff" द्वारा परिभाषित प्रारूप में है) और इसमें सर्वर को मूल संस्करण को परिवर्तित करने के लिए आवश्यक परिवर्तनों को फिर से बनाने के लिए पर्याप्त जानकारी शामिल होनी चाहिए वांछित संस्करण के लिए संसाधन।

तो, प्रोफ़ाइल 123 के देखे जाने की संख्या अद्यतन करने के लिए, मैं करूंगा:

PATCH /profiles/123 HTTP/1.1 
Host: www.example.com 
Content-Type: application/x-counters 

views + 1 

कहाँ x-counters मीडिया प्रकार (जो मैं अभी बना हुआ) field operator scalar tuples के कई पंक्तियों से बना है। views = 500 या views - 1 या views + 3 सभी वैध रूप से मान्य हैं (लेकिन इसे semantically प्रतिबंधित किया जा सकता है)।

मैं कुछ और मज़बूत समझ सकता हूं- अभी तक एक और मीडिया प्रकार बनाने पर, लेकिन मुझे नम्रता से सुझाव है कि यह POST/PUT विकल्प से अधिक सही है। एक क्षेत्र के लिए संसाधन बनाना, अपने स्वयं के यूआरआई और विशेष रूप से अपने विवरण (जो मैं वास्तव में नहीं रखता, मेरे पास एक पूर्णांक है) के साथ पूरा करना गलत और बोझिल लगता है। अगर मेरे पास बनाए रखने के लिए 23 अलग-अलग काउंटर हैं तो क्या होगा?

+1

मानक से कमजोर पड़ता है क्योंकि "पैच कार्रवाई के बाद संसाधन की वांछित सामग्री" लागू नहीं होती है। जैसे इकाई वांछित परिणाम नहीं, निष्पादित करने के लिए एक निर्देश है। – Pocketsand

+0

@Pocketsand ने जो कहा है उसके बाद, क्या यह दृष्टिकोण "समान अंतरफलक" बाधा के तहत उप-बाधा "प्रतिनिधियों के माध्यम से संसाधनों का कुशलता" का उल्लंघन नहीं करता है? जहां आपको उस संसाधन का प्रतिनिधित्व करना चाहिए जिसे आप देखना चाहते हैं, इसके बारे में निर्देश भेजने के बजाय इसे कैसे छेड़छाड़ करना है। – dayuloli

+0

@dayuloli यदि आप अभी भी एक समाधान पर विचार कर रहे हैं तो मैंने [एक उत्तर जोड़ा] [https://stackoverflow.com/questions/1426845/incrementing-resource-counter-in-a-restful-way-put-vs- पोस्ट/44852115 # 44852115) जिसके साथ मैंने जाने का फैसला किया, यह आपकी आवश्यकताओं के अनुरूप हो सकता है या हो सकता है। – Pocketsand

0

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

RFC5789 देखें: के रूप में [RFC2616], धारा 9.1 द्वारा परिभाषित

PATCH न सुरक्षित है और न ही idempotent है।

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

0

पिछले जवाब मूल्यांकन करने के बाद मैंने तय कर लिया PATCH अनुचित था और, मेरे प्रयोजनों के लिए, चारों ओर गया था KISS principle का उल्लंघन एक छोटी सी कार्य के लिए साथ सामग्री प्रकार नगण्य। मैं केवल n + 1 बढ़ाने के लिए की जरूरत है तो मैं बस ऐसा किया:

PUT /profiles/123$views 
++ 

कहाँ ++ संदेश का मुख्य भाग है और एक अनुदेश एक करके संसाधन बढ़ाने के लिए के रूप में नियंत्रक द्वारा व्याख्या की है।

मैं $ संसाधन के क्षेत्र/संपत्ति deliminate के रूप में यह एक legal sub-delimiter है चुना है और, मेरे प्रयोजनों के लिए, / जो, मेरी राय में, traversability की वाइब है की तुलना में अधिक सहज ज्ञान युक्त लग रहा था।

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