पक्ष के साथ एक PUT का उपयोग स्वीकार्य (REST) ​​को प्रभावित करता है


9

जब भी उपयोगकर्ता कोई फ़ॉर्म अपडेट करता है, मैं एक पूर्ववत इतिहास बनाना चाहता हूं। क्योंकि यह एक अद्यतन है, मैं एक PUT अनुरोध का उपयोग करना चाहता हूं। हालाँकि, मैंने पढ़ा कि PUT को कोई साइड इफेक्ट नहीं होना चाहिए

क्या यहां PUT का उपयोग करना स्वीकार्य है? क्या बेहतर विकल्प हैं?

PUT /person/F02E395A235

{
   time: 1234567,
   fields: {
      name: 'John',
      age: '41'
   }
}

सर्वर में

doPut('person/:personId',
   // create a new person snapshot
)

संपादित करें:

उपयोगकर्ता को इतिहास दिखाई देगा, कई बार कॉल करने के परिणामस्वरूप कई संस्करण होंगे।

समाधान यह जांचने के लिए था कि क्या संस्करण बनाने से पहले अद्वितीय था।

जवाबों:


11

HTTP / 2 को प्रारूपित करने वाले लोग पुराने अर्थों को बनाए रखते हुए HTTP के उनके विचारों के बारे में बहुत अधिक क्रियात्मक थे। आइए देखें कि आइडेंटिटी / 2 ड्राफ्ट कल्पना के बारे में क्या कहना है:

4.2.2। निष्प्राण विधियाँ

अनुरोध विधि को "निष्पादनीय" माना जाता है यदि उस विधि के साथ कई समान अनुरोधों के सर्वर पर इच्छित प्रभाव समान एकल अनुरोध के लिए प्रभाव के समान है। इस विनिर्देश, PUT, DELETE और सुरक्षित अनुरोध द्वारा परिभाषित अनुरोध विधियों के लिए विधियाँ निष्प्राण हैं।

सुरक्षित की परिभाषा की तरह, उपयोगकर्ता द्वारा मांगी गई संपत्ति पर ही लागू होती है; एक सर्वर प्रत्येक अनुरोध को अलग से लॉग इन करने के लिए स्वतंत्र है, एक संशोधन नियंत्रण इतिहास को बनाए रखने, या प्रत्येक बेकार अनुरोध के लिए अन्य नॉन-इम्पोटेंट साइड-इफेक्ट्स को लागू करने के लिए

सर्वर पर इरादा प्रभाव प्रत्येक इस तरह के एक PUT अनुरोध के लिए करने के लिए है संसाधन है कि यूआरआई से पहचान अद्यतन । आपके मामले में ठीक ऐसा ही होता है।

आप संस्करण संसाधनों का फैसला वास्तव में यहाँ कोई फर्क नहीं पड़ता। यदि आप कुछ भी नहीं बदलने पर नया संस्करण नहीं बनाना चाहते हैं, तो आपको संसाधन के सबसे हाल के (या अन्यथा पहचाने गए) संस्करण के साथ PUT अनुरोध में पेलोड की तुलना करने की आवश्यकता होगी, और जब गुणों में से कोई भी नहीं बदला है आप एक नया संस्करण नहीं बनाना चुन सकते हैं ।


आपका संपादन:

उपयोगकर्ता को इतिहास दिखाई देगा, कई बार कॉल करने पर परिणाम कई हो जाएंगे

जहां तक ​​संसाधन की बात है, तो इसका कोई दुष्प्रभाव नहीं है । उस URI में संसाधन नहीं बदलता (उसी गुण को PUT मिलता है)। इतिहास सिर्फ मेटाडेटा है, क्योंकि यह संभवतः एक अलग यूआरआई द्वारा या विभिन्न अनुरोध हेडर के साथ अनुरोध किया गया है।


सिवाय इसके कि आप मेरी विशिष्ट समस्या का उत्तर देते हैं: "क्या यह PUT के लिए स्वीकार्य है कि वह एक उपयोगकर्ता दृश्य इतिहास बना सके", और मुझे एक समाधान दें, धन्यवाद
roo2

किस समस्या का हल है? कि timeसंपत्ति अद्यतन हो जाता है? मुझे लगता है कि मेटाडाटा भी है, भले ही यह है में संसाधन।
कोडकस्टर डिस

1
समस्या यह थी कि यदि कई PUT भेजे गए, तो उपयोगकर्ता को अनावश्यक जानकारी के साथ एक लंबा इतिहास मिलेगा। अद्वितीयता के लिए जाँच की जाती है कि
roo2

12

HTTP दो गुणों के बीच अंतर करता है:

  • Idempotency
  • सुरक्षा

निम्नानुसार कल्पना को परिभाषित किया गया है:

तरीकों में भी " बेकारता " की संपत्ति हो सकती है (एक तरफ त्रुटि या समाप्ति मुद्दों से) एन> 0 के समान प्रभाव के समान अनुरोध एक ही अनुरोध के लिए समान है। तरीकों GET, HEAD, PUTऔर DELETEइस संपत्ति को साझा करें। इसके अलावा, तरीकों OPTIONSऔर TRACE SHOULD के साइड इफेक्ट्स नहीं हैं, और इसलिए स्वाभाविक रूप से उदासीन हैं।

और सुरक्षा:

विशेष रूप से, सम्मेलन की स्थापना की गई है कि GETऔर HEADतरीकों को पुनर्प्राप्ति के अलावा अन्य कार्रवाई करने का महत्व नहीं है। इन तरीकों को " सुरक्षित " माना जाना चाहिए । यह उपयोगकर्ता एजेंटों को अन्य तरीकों का प्रतिनिधित्व करने की अनुमति देता है, जैसे कि POST, PUTऔर DELETE, एक विशेष तरीके से, ताकि उपयोगकर्ता को इस तथ्य से अवगत कराया जाए कि संभवतः एक असुरक्षित कार्रवाई का अनुरोध किया जा रहा है।

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

ध्यान दें कि सुरक्षा का अर्थ है कि बेरोजगारी: यदि किसी विधि का कोई साइड-इफेक्ट नहीं है, तो इसे कई बार प्रदर्शन करने पर एक ही साइड-इफ़ेक्ट प्राप्त होगा, जैसा कि एक बार करने के बाद।

यह तरीकों को तीन श्रेणियों में रखता है:

  • सुरक्षित (और इस प्रकार भी idempotent): GET, HEAD, OPTION,TRACE
  • idempotent लेकिन जरूरी सुरक्षित नहीं: PUT,DELETE
  • न तो निष्प्राण और न ही सुरक्षित: POST

किसी भी पक्ष को प्रभावित करने के लिए PUT की आवश्यकता है।

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

सुरक्षा के बारे में अनुभाग में अंतिम पैराग्राफ पर ध्यान दें [जोर मेरा]:

स्वाभाविक रूप से, यह सुनिश्चित करना संभव नहीं है कि GETअनुरोध करने के परिणामस्वरूप सर्वर साइड-इफेक्ट उत्पन्न न करे ; वास्तव में, कुछ गतिशील संसाधन एक विशेषता मानते हैं। यहाँ महत्वपूर्ण अंतर यह है कि उपयोगकर्ता ने साइड-इफ़ेक्ट का अनुरोध नहीं किया है, इसलिए उनके लिए जवाबदेह नहीं ठहराया जा सकता है

यद्यपि यह वाक्य GETसुरक्षा और सुरक्षा के बारे में बात करता है , हम यह मान सकते हैं कि लेखकों का भी यही मतलब था कि वे इसी तरह के तर्क PUTऔर शालीनता को लागू करें । IOW: नामांकित संसाधन को अपडेट करने के लिए PUTकेवल एक उपयोगकर्ता-दृश्यमान साइड-इफेक्ट होना चाहिए । इसके अन्य दुष्प्रभाव हो सकते हैं, लेकिन उपयोगकर्ता को उनके लिए जिम्मेदार नहीं ठहराया जा सकता है।

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

IOW: आपको जितने चाहें उतने साइड-इफ़ेक्ट करने की अनुमति है, लेकिन

  1. यह उपयोगकर्ता को यह देखना होगा कि क्या उनके अनुरोध बेकार थे
  2. आप उन दुष्प्रभावों के लिए जिम्मेदार हैं, न कि उपयोगकर्ता

हां, आलस्य इस संसाधन की स्थिति के बारे में है, न कि किसी अन्य सर्वर / सेवा की स्थिति के बारे में जो PUT के कार्य से प्रभावित है।
मार्जन वेनमा

रेस्ट में सुरक्षा और सुविधा के महान स्पष्टीकरण के लिए
अपवोट

महान व्याख्या। हालांकि, आप इस तरह के कई बयान देते हैं: "PUT का पूरा बिंदु एक साइड इफेक्ट है, अर्थात् एक संसाधन को अपडेट करना।" यह एक विरोधाभास की तरह लगता है जब तक कि आप "साइड इफेक्ट" शब्द से कुछ अलग नहीं करते हैं, "प्राथमिक या इच्छित प्रभाव के अतिरिक्त कुछ माध्यमिक या अनजाने में होता है।"
4

@MarredCheese: मैं इस शब्द का उपयोग इसके मानक प्रोग्रामिंग अर्थ में कर रहा हूं, जिसका मूल अर्थ है "कोई भी 'परिणाम' जो कि रिटर्न मान नहीं है"।
जोर्ग डब्ल्यू मित्तग

आह, बिल्कुल। स्पष्टीकरण के लिए धन्यवाद।
MarredCheese 13

1

आप सही हैं कि PUT को कोई साइड इफ़ेक्ट नहीं होना चाहिए , हालाँकि मैं इसमें कुछ जोड़ूँगा।

जिस संसाधन के लिए PUT ऑपरेशन किया जा रहा है, उस पर PUT का कोई पक्ष नहीं होना चाहिए

आप एक ऐसे personसंसाधन को अपडेट कर रहे हैं F02E395A235, जिसकी पहचान की जाती है , इसलिए PUT का उपयोग करना सही है। अब एक व्यावसायिक नियम के रूप में आप उन परिवर्तनों पर भी नज़र रखते हैं जो कॉलिंग इकाई (उपभोक्ता का सेवा से अदृश्य) है। यह personसंसाधन में एक नया आइटम नहीं जोड़ेगा । ऐतिहासिक स्नैपशॉट /person/समापन बिंदु का उपयोग करके पहुंच योग्य नहीं होगा । इसलिए मेरा मानना ​​है कि, इस मामले में PUT पूरी तरह से स्वीकार्य होना चाहिए।


1
संसाधन पर कोई दुष्प्रभाव नहीं डाला जा रहा है, लेकिन अन्य सामान (काउंटर, लॉगिंग, ऑडिट निशान, ...) पर किसी भी प्रकार के दुष्प्रभाव पूरी तरह से स्वीकार्य हैं।
मार्जन वेनमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.