2015-05-25 8 views
8

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

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

आरईएसटी वास्तुकला के अनुसार, मैंने एक संसाधन/परियोजनाओं का निर्माण किया। POST का उपयोग एक नई परियोजना बनाने के लिए किया जाता है, और PUT का उपयोग किसी मौजूदा प्रोजेक्ट को बदलने के लिए किया जाता है।

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

एक नई स्थिति के साथ एक परियोजना को पॉट करना भी एक विकल्प नहीं है, क्योंकि यह PUT की idempotency का उल्लंघन करता है।

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

इस तरह की समस्या मेरे काम में काफी सर्वव्यापी है, और इसे सामान्यीकृत किया जा सकता है: एक जटिल समग्र इकाई को अद्यतन करने का सबसे सही और परमाणु तरीका क्या है जिसके लिए व्यावसायिक तर्क द्वारा केवल आंशिक अद्यतन की अनुमति है?

उत्तर

3

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

आप देख सकते हैं कि PATCH विधि के अंतर्गत संचालन का वर्णन करने के लिए एक प्रारूप है। इसे JSON पैच कहा जाता है (https://tools.ietf.org/html/rfc6902 देखें)। यह प्रारूप वर्णन करता है कि आप अपने अनुरोध के भीतर क्या करना चाहते हैं: एक तत्व जोड़ें, इसे अपडेट करें, इसे हटाएं, ...

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

PATCH /projects/1 
[ 
    { 
     "op": "replace", 
     "path": "/name", 
     "value": "the new name of the project" 
    }, 
    { 
     "op": "remove", 
     "path": "/statuses/1" 
    }, 
    { 
     "op": "add", 
     "path": "/statuses/", 
     "value": { 
      "name": "my status", 
      (...) 
     } 
    } 
] 

सूचना है कि आप रख सकते हैं कि आप क्या चाहते हैं संसाधन स्थिति में संबंधित तत्व की पहचान करने के लिए विशेषता name। तो /statuses/1 सरणी में दूसरा तत्व हो सकता है, मान 1 या कुछ और आईडी के साथ स्थिति।

अनुरोध के लिए सर्वर-साइड प्रोसेसिंग परमाणु हो सकता है।

मैंने थोक अपडेट के बारे में एक ब्लॉग पोस्ट लिखा: https://templth.wordpress.com/2015/05/14/implementing-bulk-updates-within-restful-services/। मुझे लगता है कि "थोक अद्यतन लागू करना" अनुभाग आप जो खोज रहे हैं उसके अनुरूप हो सकता है।

आशा है कि यह आप में मदद करता है, थियरी

+0

वाह। मुझे इस आरएफसी के बारे में पता नहीं था। धन्यवाद! –

+0

आपका स्वागत है! यह सुनकर खुशी हुई कि यह आपकी मदद करता है! –

5

क्या आपको HTTP पैच की आवश्यकता है? संसाधन के लिए डेल्टा अपडेट व्यक्त करने की क्रिया है।

http://tools.ietf.org/html/rfc5789

+0

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

+1

आरईएसटी संदर्भ के आधार पर संसाधनों/संस्थाओं पर HTTP क्रियाओं (प्राप्त, पोस्ट, ...) का उपयोग करने का समर्थन करता है। किसी संसाधन/इकाई पर आंशिक अद्यतन के लिए HTTP पैच का उपयोग करना उतना ही विश्वसनीय है जितना हो सकता है। यह सच है कि पैच भूल गया/अनदेखा प्रतीत होता है, लेकिन इससे कुछ भी नहीं है। इसमें कई कारण हैं, लेकिन उनमें से कोई भी नहीं है क्योंकि इसका उपयोग एक विश्वसनीय डिजाइन के साथ संघर्ष कर सकता है। – Jepe

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