क्या वास्तव में DELETE बेरोजगार है?


165

DELETE को बेरोजगार माना जाता है।

अगर मैं http://example.com/account/123 DELETE करता हूं, तो यह खाता हटाने जा रहा है।

यदि मैं इसे फिर से करता हूं तो मुझे 404 की उम्मीद होगी, क्योंकि खाता अब मौजूद नहीं है? क्या होगा यदि मैं एक ऐसे खाते का उपयोग करने का प्रयास करूं जो कभी अस्तित्व में न हो?


11
जवाब के अलावा, मैं सुझाव देना चाहूंगा कि सामान्य रूप से बहुत बड़ी विशेषता पर ध्यान न दें: यह कम्यूटिटी और समवर्ती अनुरोधों के बारे में कुछ नहीं कहता है। उदाहरण के लिए उसी "R1" PUT अनुरोध के N + 1 का समान प्रभाव होना चाहिए, लेकिन आप नहीं जानते हैं कि किसी अन्य ग्राहक ने आपके बीच एक अलग PUT / DELETE "R2" अनुरोध किया है, इसलिए n R1 = R1 और m R2 = R2, कुछ ऐसा है जहाँ आप "R1" और "R2" अनुरोध प्राप्त करते हैं, जरूरी नहीं कि आप केवल एक ग्राहक के दृष्टिकोण को लें, तो यह "आकर्षक" दिखाई देगा।
ब्रूनो

जवाबों:


188

अनुरोध पूरा हो जाने के बाद Idempotence प्रणाली की स्थिति को संदर्भित करता है


सभी मामलों में (त्रुटि के मुद्दों के अलावा - नीचे देखें), खाता अब मौजूद नहीं है।

से यहाँ

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


कुंजी बिट N-0 के साइड-इफेक्ट्स हैं समान अनुरोध एकल अनुरोध के लिए समान है।

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


3
साइड-इफ़ेक्ट! == सर्वर स्टेट
wrl 20'13

2
@wprl वास्तव में यह "दुष्प्रभाव" क्या है, इस पर एक बहस है। यह "सर्वर स्थिति" हो सकता है या यह क्लाइंट को भेजा गया प्रतिसाद हो सकता है। leedavis81.github.io/is-a-http-delete-requests-idempotent
एलिरेज़ा

यहां एक तर्क यह है कि एक दूसरे DELETE पर 404 वास्तव में सर्वर की स्थिति को बदल सकता है: stackoverflow.com/a/45194747/317522
पाउलो मर्सन

1
@PauloMerson धन्यवाद, व्यक्तिगत रूप से मुझे नहीं लगता कि यह मायने रखता है कि दूसरा रिटर्न 404 है या 200, सर्वर की स्थिति नहीं बदली है इसलिए मैं इससे खुश हूं।
क्रिस मैकॉले

46

Idempotent अनुरोध के प्रभाव के बारे में है, न कि उस प्रतिक्रिया कोड के बारे में जो आपको मिलता है।

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.2.2.2 कहते हैं:

तरीकों में भी "बेकारता" की संपत्ति हो सकती है (एक तरफ त्रुटि या समाप्ति मुद्दों से) एन> 0 के समान प्रभाव एक ही अनुरोध के लिए समान है।

हालांकि आपको एक अलग प्रतिक्रिया कोड मिल सकता है, लेकिन समान संसाधन के लिए N + 1 DELETE अनुरोध भेजने का प्रभाव समान माना जा सकता है।


13

महत्वपूर्ण अंतर यह है कि बेरोजगारी साइड-इफेक्ट्स को संदर्भित करती है , न कि सभी -प्रभाव या प्रतिक्रियाओं को। यदि आप ऐसा करते हैं DELETE http://example.com/account/123तो प्रभाव यह है कि खाता 123 अब सर्वर से हटा दिया गया है। यह एक और केवल प्रभाव है, एक और केवल सर्वर की स्थिति में परिवर्तन होता है। अब आपको DELETE http://example.com/account/123फिर से वही अनुरोध करने की अनुमति देता है , सर्वर अलग तरह से प्रतिक्रिया देगा, लेकिन इसकी स्थिति समान है।

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


7

से HTTP आरएफसी :

तरीकों में भी "बेकारता" की संपत्ति हो सकती है (एक तरफ त्रुटि या समाप्ति मुद्दों से) एन> 0 के समान प्रभाव एक ही अनुरोध के लिए समान है।

ध्यान दें कि "दुष्प्रभाव", "प्रतिक्रिया" नहीं है।


7

हाँ। प्रतिक्रिया कोड के बावजूद।

HTTP 1.1 (जोर मेरा) के लिए नवीनतम RFC से :

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

यह स्पष्ट रूप से कहता है कि प्रतिक्रिया भिन्न हो सकती है। इससे भी महत्वपूर्ण बात यह है कि यह अवधारणा का कारण बताती है: यदि कोई कार्रवाई बेकार है, तो क्लाइंट किसी भी त्रुटि का सामना करने पर कार्रवाई को दोहरा सकता है, और जानता है कि ऐसा करने से वह कुछ भी दुर्घटनाग्रस्त नहीं होगा; यदि नहीं, तो ग्राहक को यह देखने के लिए एक अतिरिक्त क्वेरी (संभवतः GET) करनी होगी कि क्या पिछला प्रभावी है, इससे पहले कि वह सुरक्षित रूप से कार्रवाई दोहराए। जब तक सर्वर इस तरह की गारंटी दे सकता है, तब तक कार्रवाई बेकार है। एक अन्य टिप्पणी से उद्धरण :

कम्प्यूटिंग इम्पोटेंस एक सिस्टम की मजबूती के बारे में है। चूंकि चीजें विफल हो सकती हैं (उदाहरण के लिए नेटवर्क आउटेज), जब विफलता का पता चलता है, तो आप कैसे ठीक होते हैं? सबसे आसान रिकवरी बस इसे फिर से करना है, लेकिन यह केवल तभी काम करता है जब इसे फिर से करना बेकार हो। उदाहरण के discard(x)लिए उदासीन है, लेकिन pop()ऐसा नहीं है। यह त्रुटि पुनर्प्राप्ति के बारे में है।


2

मुझे लगता है कि एक ही बात, 404 - खाता मौजूद नहीं है।

आप 400 - बुरा अनुरोध कर सकते हैं। लेकिन REST के अर्थ में जिस वस्तु पर आपने कार्रवाई करने का अनुरोध किया है, वह मौजूद नहीं है। जिसका अनुवाद 404 है।


1
एक 400 उत्पन्न करने के लिए आपको यह जानना होगा कि वह वस्तु मौजूद थी, जो बहुत ही बेचैन है।
अन्नकूट

1
@annakata, 400 उन संसाधनों के लिए भी नहीं है, जो अस्तित्व में थे (शायद आपके मन में 410 / Gone थे), यह बुरे अनुरोधों के लिए है "अनुरोध को सर्वर द्वारा विकृत सिंटैक्स के कारण समझा नहीं जा सका।"
ब्रूनो

3
@ ब्रूनो - मुझे पता है कि इसका क्या मतलब है, ओपी ने इसका हवाला दिया।
15

1
मुझे लगता है कि 200 ठीक होगा। आप सर्वर की स्थिति चाहते हैं कि खाता चला गया है। क्या इससे कोई फर्क पड़ता है कि वास्तव में किस अनुरोध ने इसे दूर किया है? यह अभी भी दूसरे अनुरोध पर चला गया है, सर्वर स्थिति नहीं बदली है।
एंडी

1

मेरे दूसरे उत्तर से उद्धृत :

ऐतिहासिक रूप से, 1999 में प्रकाशित RFC 2616, सबसे अधिक संदर्भित HTTP 1.1 चश्मा था। दुर्भाग्य से इसका वर्णन बेमेलता पर अस्पष्ट था , जो इन सभी बहसों के लिए जगह छोड़ देता है। लेकिन उस स्पेक्स को RFC 7231 द्वारा अधिगृहीत किया गया है। RFC 7231 से उद्धृत , धारा 4.2.2 सुस्पष्ट तरीके , मेरा जोर:

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

तो, यह ऐनक में लिखा है, idempotency सर्वर पर प्रभाव के बारे में है। पहला DELETE 204 लौटा रहा है और फिर बाद में DELETE 404 लौटा रहा है, इस तरह के अलग-अलग स्टेटस कोड DELETE को अप्रतिष्ठित नहीं करते हैं। 204 के बाद के रिटर्न को सही ठहराने के लिए इस तर्क का उपयोग करना, बस अप्रासंगिक है।


ठीक है तो यह बेवकूफी के बारे में नहीं है। लेकिन फिर एक अनुवर्ती सवाल यह हो सकता है कि अगर हम अभी भी बाद के DELETE में 204 का उपयोग करना चाहते हैं, तो क्या होगा? ठीक है न?

अच्छा प्रश्न। प्रेरणा समझ में आता है: क्लाइंट को अभी भी त्रुटि से निपटने के बारे में चिंता किए बिना, अपने इच्छित परिणाम तक पहुंचने की अनुमति देता है। मैं कहूंगा, 204 को बाद के DELETE में लौटाना, काफी हद तक हानिरहित सर्वर-साइड "व्हाइट झूठ" है, जो क्लाइंट-साइड तुरंत एक अंतर नहीं बताएगा। यही कारण है कि वहाँ लोग कर रहे हैं कि जंगली में और यह अभी भी काम करता है। बस यह ध्यान रखें कि, इस तरह के झूठ को शब्दार्थ रूप से अजीब माना जा सकता है, क्योंकि "GET / गैर-मौजूद" 404 रिटर्न देता है, लेकिन "DELETE / गैर-मौजूद" 204 देता है, उस समय ग्राहक यह पता लगाएगा कि आपकी सेवा पूरी तरह से अनुपालन नहीं करती है धारा 6.5.4 404 नहीं मिली

लेकिन फिर, RFC 7231 द्वारा संकेतित तरीका, यानी बाद में DELETE पर 404 लौटना, पहली जगह में एक मुद्दा नहीं होना चाहिए। कई और डेवलपर्स ने ऐसा करने के लिए चुना। यह शायद इसलिए है, क्योंकि कोई भी क्लाइंट जो HTTP DELETE (या उस मामले के लिए कोई HTTP विधि) को लागू करता है, वह आँख मूंदकर यह अनुमान नहीं लगाएगा कि परिणाम हमेशा 2xx सफल होगा। और फिर, एक बार डेवलपर ने त्रुटि से निपटने पर विचार करना शुरू कर दिया, 404 नॉट फाउंड पाया गया जो पहली त्रुटियों में से एक होगा जो मन में आता है। उस बिंदु पर, वह उम्मीद करते हैं कि निष्कर्ष निकाला जाएगा कि, यह 404 त्रुटि को अनदेखा करने के लिए HTTP DELETE ऑपरेशन के लिए शब्दार्थ रूप से सुरक्षित है। समस्या सुलझ गयी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.