कल्पना करें कि कुछ आईडी-डेटा कुछ संसाधन-संसाधन को संग्रहीत करता है जो कुछ आईडी के साथ तीन संलग्नक (उदा। पीडीएफ) प्रति डेटाम स्टोर करता है।एकाधिक संसाधनों के विश्वसनीय परमाणु अद्यतन?
यूआरएल स्कीम
data/{id}/attachment1
data/{id}/attachment2
data/{id}/attachment3
एक RESTful API संलग्नक प्राप्त/PUT प्रदान करने के लिए मौजूद है/सर्वर साइड पर CRUD संचालन को लागू करने के संचालन DELETE है।
दे आईडी 123 हो, मैं एक ऑपरेशन जहां
- attachment1 एक नया लगाव की जगह प्रदर्शन करने के लिए चाहते हैं (जैसे कि
GET file/123/attachment1
रिटर्न एक नया लगाव) - attachment2 हटा दी जाती है (जैसे कि कि
GET file/123/attachment2
रिटर्न 404) - अटैचमेंट 3 अपरिवर्तित बनी हुई है।
अद्यतन परमाणु होना चाहिए - पूरा अद्यतन सर्वर या कुछ भी नहीं द्वारा किया जाता है।
एक साधारण PUT file/123/attachment1
और DELETE file/123/attachment2
लागू करना परमाणु नहीं है, क्योंकि क्लाइंट PUT के बाद क्रैश हो सकता है और सर्वर के पास कोई संकेत नहीं है कि उसे इस मामले में रोलबैक करना चाहिए।
तो मैं ऑपरेशन को एक यथार्थ तरीके से कैसे कार्यान्वित करूं?
मैं दो समाधान के बारे में सोचा है, लेकिन वे दोनों 100% RESTful होने लगते नहीं है:
- उपयोग PATCH (रखा जा सकता है, लेकिन PATCH बेहतर एक आंशिक अद्यतन के शब्दों को दर्शाता है) बहुखण्डीय साथ/डेटा/123 पर फॉर्म-डेटा: मल्टीपार्ट/फॉर्म-डेटा एक नई "संलग्नक 1" और फ़ील्ड से जुड़े "एप्लिकेशन/पीडीएफ" से जुड़ी इकाइयों का एक अनुक्रम है जो इंगित करने के लिए शून्य-मूल्य का प्रतिनिधित्व करेगा अनुलग्नक 2 का विलोपन।
हालांकि यह atomicity सुनिश्चित करता है, मुझे शक है इस RESTful है के बाद से मैं ओवरलोड जो वर्दी इंटरफ़ेस बाधा का उल्लंघन करती है अलग पैरामीटर सूची का उपयोग करने PATCH विधि,।
- लेनदेन का प्रतिनिधित्व करने वाले संसाधन का उपयोग करें। मैं डेटा आईडी 123 को एक लेन-देन-यूआरएल पर पोस्ट कर सकता हूं जो लेनदेन संसाधन सर्वर पर संग्रहीत डेटा-संसाधन की मौजूदा स्थिति की एक प्रति का प्रतिनिधित्व करेगा, उदाहरण के लिए सर्वर पर संग्रहीत करता है, उदा। लेन-देन/डेटा/123। अब मैं PUT और को इस अस्थायी संसाधन (उदा।
DELETE transaction/data/123/attachment2
) के अनुलग्नकों पर हटा सकता हूं और को लेनदेन/डेटा/123 पर PUT के माध्यम से सर्वर के संसाधन के इस संस्करण की प्रतिबद्धता को संवाद कर सकता हूं। यह परमाणुता सुनिश्चित करता है जबकि कई क्लाइंट से निपटने के लिए अतिरिक्त सर्वर साइड तर्क लागू करता है, जो समान संसाधन और क्रैश किए गए क्लाइंट को बदलता है जो कभी नहीं किया जाता है।
हालांकि यह आरईएसटी के साथ संगत लगता है, ऐसा लगता है कि यह स्टेटलेसनेस की बाधा का उल्लंघन करता है।लेनदेन संसाधन की स्थिति सेवा राज्य नहीं है बल्कि आवेदन राज्य है, क्योंकि प्रत्येक लेनदेन संसाधन एक ग्राहक से जुड़ा हुआ है।
मैं यहां फंस गया हूं, इसलिए कोई विचार उपयोगी होगा, धन्यवाद!
दूसरे दृष्टिकोण में डेटा परिवर्तनों का एक अच्छा इतिहास प्रदान करने का लाभ है और आपको कुछ लॉगिंग छोड़ने की सुविधा मिल सकती है। – Jasper
@mtsz मैं अभी इस समस्या से जूझ रहा हूं। मुझे आपके द्वारा चुने गए उत्तर को पसंद है, लेकिन यह एक लघु, अस्थायी जीवनकाल के साथ एक लेनदेन संसाधन बनाने के लिए बहुत सारे काम की तरह लगता है। क्या आपको लगता है कि परमाणु लेनदेन को "स्विचरू" जैसे नाम देने के लिए बुरा होगा और उस लेनदेन को करने वाली एक विशिष्ट वेब सेवा बनाएं? उदाहरण के लिए, {fileId: 123} के शरीर के साथ POST/doSwitcheroo .... इस सेवा में आईडी 123 –