HTTP DELETE अनुरोध जारी करते समय, अनुरोध URI को हटाने के लिए संसाधन की पूरी तरह से पहचान करनी चाहिए। हालांकि, क्या यह अनुरोध के निकाय निकाय के हिस्से के रूप में अतिरिक्त मेटा-डेटा जोड़ने के लिए अनुमति है?
HTTP DELETE अनुरोध जारी करते समय, अनुरोध URI को हटाने के लिए संसाधन की पूरी तरह से पहचान करनी चाहिए। हालांकि, क्या यह अनुरोध के निकाय निकाय के हिस्से के रूप में अतिरिक्त मेटा-डेटा जोड़ने के लिए अनुमति है?
जवाबों:
कल्पना स्पष्ट रूप से मना नहीं करती है या इसे हतोत्साहित नहीं करती है, इसलिए मैं कहना चाहूंगा कि इसकी अनुमति है।
Microsoft इसे उसी तरह से देखता है (मैं दर्शकों में बड़बड़ा सकता है), वे MSDN लेख में ADO.NET डेटा सेवा रूपरेखा के DELETE विधि के बारे में बताते हैं :
यदि एक DELETE अनुरोध में एक निकाय शामिल है, तो निकाय को अनदेखा किया जाता है [...]
इसके अतिरिक्त यहां RFC2616 (HTTP 1.1) को अनुरोधों के संबंध में क्या कहना है:
Content-Length
या Transfer-Encoding
हैडर (धारा 4.3)प्रतिक्रियाओं के लिए, इसे परिभाषित किया गया है:
HTTP 1.1 विनिर्देशन ( RFC 7231 ) का नवीनतम अपडेट स्पष्ट रूप से एक DELETE अनुरोध में एक निकाय निकाय को अनुमति देता है:
DELETE अनुरोध संदेश के भीतर एक पेलोड कोई परिभाषित शब्दार्थ नहीं है; DELETE अनुरोध पर पेलोड बॉडी भेजने से अनुरोध को अस्वीकार करने के लिए कुछ मौजूदा कार्यान्वयन हो सकते हैं।
A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.
तो यह एक पिछड़े संगतता चेतावनी के साथ आता है, यह सुझाव दे रहा है कि अगला मानक कह रहा होगा: 'हां! DELETE
एक शरीर हो सकता है `।
A payload within a DELETE request message has no defined semantics
। तो शरीर को अनुमति है।
Tomcat और Jetty के कुछ संस्करण मौजूद होने पर एक निकाय निकाय की उपेक्षा करते हैं। यदि आप इसे प्राप्त करने का इरादा रखते हैं, तो यह एक उपद्रव हो सकता है।
हटाने के अनुरोध में शरीर का उपयोग करने का एक कारण आशावादी संगरोध नियंत्रण के लिए है।
आप रिकॉर्ड के संस्करण 1 को पढ़ते हैं।
GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }
आपका सहकर्मी रिकॉर्ड का संस्करण 1 पढ़ता है।
GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }
आपका सहकर्मी रिकॉर्ड बदलता है और डेटाबेस को अपडेट करता है, जो संस्करण को 2 में अपडेट करता है:
PUT /some-resource/1 { id:1, status:"important", version:1 }
200 OK { id:1, status:"important", version:2 }
आप रिकॉर्ड हटाने की कोशिश करते हैं:
DELETE /some-resource/1 { id:1, version:1 }
409 Conflict
आपको एक आशावादी ताला अपवाद मिलना चाहिए। रिकॉर्ड को फिर से पढ़ें, देखें कि यह महत्वपूर्ण है, और शायद इसे हटाएं नहीं।
इसका उपयोग करने का एक अन्य कारण एक समय में कई रिकॉर्ड को हटाना है (उदाहरण के लिए, पंक्ति-चयन चेक-बॉक्स के साथ एक ग्रिड)।
DELETE /messages
[{id:1, version:2},
{id:99, version:3}]
204 No Content
ध्यान दें कि प्रत्येक संदेश का अपना संस्करण है। हो सकता है कि आप कई हेडर का उपयोग करके कई संस्करणों को निर्दिष्ट कर सकते हैं, लेकिन जॉर्ज द्वारा, यह सरल और बहुत अधिक सुविधाजनक है।
यह टॉमकैट (7.0.52) और स्प्रिंग एमवीसी (4.05) में काम करता है, संभवतः पहले के संस्करणों में भी डब्ल्यू:
@RestController
public class TestController {
@RequestMapping(value="/echo-delete", method = RequestMethod.DELETE)
SomeBean echoDelete(@RequestBody SomeBean someBean) {
return someBean;
}
}
If-Unmodified-Since
या Etag
, यही वह है)।
यह मुझे प्रतीत होता है कि RFC 2616 इसे निर्दिष्ट नहीं करता है।
खंड 4.3 से:
अनुरोध के संदेश-हेडर में सामग्री-लंबाई या स्थानांतरण-एन्कोडिंग हेडर फ़ील्ड के शामिल होने से एक अनुरोध में एक संदेश-निकाय की उपस्थिति का संकेत मिलता है। यदि अनुरोध विधि (खंड 5.1.1) के विनिर्देश अनुरोध में एक निकाय-निकाय को भेजने की अनुमति नहीं देता है, तो एक संदेश-निकाय अनुरोध में शामिल नहीं होना चाहिए। एक सर्वर किसी भी अनुरोध पर संदेश-निकाय को पढ़ता और अग्रेषित करता है; यदि अनुरोध विधि में निकाय-निकाय के लिए परिभाषित शब्दार्थ शामिल नहीं हैं, तो अनुरोध को संभालते समय संदेश-निकाय SHOULD को अनदेखा किया जाना चाहिए।
और धारा 9.7:
DELETE विधि अनुरोध करती है कि मूल सर्वर अनुरोध-URI द्वारा पहचाने गए संसाधन को हटा दें। इस विधि को मूल सर्वर पर मानव हस्तक्षेप (या अन्य साधनों) द्वारा ओवरराइड किया जाना चाहिए। क्लाइंट को गारंटी नहीं दी जा सकती है कि ऑपरेशन किया गया है, भले ही स्थिति कोड मूल सर्वर से लौटा हो यह इंगित करता है कि कार्रवाई सफलतापूर्वक पूरी हो गई है। हालाँकि, जब तक प्रतिक्रिया नहीं दी जाती, तब तक सर्वर SHOULD सफलता का संकेत नहीं देता, यह संसाधन को हटाने या इसे दुर्गम स्थान पर ले जाने का इरादा रखता है।
एक सफल प्रतिक्रिया 200 होना चाहिए (ठीक है) यदि प्रतिक्रिया में स्थिति का वर्णन करने वाली एक इकाई शामिल है, 202 (स्वीकृत) यदि कार्रवाई अभी तक लागू नहीं हुई है, या 204 (कोई सामग्री नहीं) यदि कार्रवाई अधिनियमित की गई है, लेकिन प्रतिक्रिया में शामिल नहीं है एक इकाई।
यदि अनुरोध कैश से गुजरता है और अनुरोध-यूआरआई एक या अधिक वर्तमान में कैश्ड संस्थाओं की पहचान करता है, तो उन प्रविष्टियों को बासी माना जाएगा। इस विधि के जवाब cacheable.c नहीं हैं
तो यह स्पष्ट रूप से अनुमत या अस्वीकृत नहीं है, और एक मौका है कि जिस तरह से एक प्रॉक्सी संदेश शरीर को हटा सकता है (हालांकि इसे पढ़ा और इसे अग्रेषित करना चाहिए)।
यदि आप अपने DELETE अनुरोध में एक निकाय की आपूर्ति करते हैं और एक Google क्लाउड HTTPS लोड बैलेंसर का उपयोग कर रहे हैं, तो यह 400 त्रुटि के साथ आपके अनुरोध को अस्वीकार कर देगा। मैं एक दीवार के खिलाफ अपना सिर पीट रहा था और पता चला कि Google, जो भी कारण से, एक शरीर के साथ एक DELETE अनुरोध एक विकृत अनुरोध है।
for whatever reason
- क्योंकि कल्पना ऐसा कहती है: पी
DELETE
बाद का है।
ऐसा लगता है कि ElasticSearch इसका उपयोग करता है: https://www.elastic.co/guide/en/elasticsearch/reference/5.x/search-request-scroll.html#_clear_scroll_api
जिसका मतलब है कि नेति इसका समर्थन करती है।
टिप्पणियों में उल्लिखित की तरह यह अब मामला नहीं हो सकता है
HTTP मेलिंग सूची पर रॉय फील्डिंग स्पष्ट करती है कि http मेलिंग सूची https://lists.w3.org/Archives/Public/ietf-http-wg/2020JanMar/0123.html और कहती है:
GET / DELETE निकाय को अनुरोध के प्रसंस्करण या व्याख्या पर कोई भी प्रभाव डालने के लिए बिल्कुल निषिद्ध है
इसका मतलब यह है कि शरीर को सर्वर के व्यवहार को संशोधित नहीं करना चाहिए। फिर वह कहते हैं:
संदेश फ़्रेमिंग को बनाए रखने के लिए प्राप्त बाइट्स को पढ़ने और त्यागने की आवश्यकता से अलग।
और अंत में शरीर को मना न करने का कारण:
केवल एक ही कारण है कि हम एक शरीर भेजने से मना नहीं किया है क्योंकि यह आलसी कार्यान्वयन के लिए कोई शरीर भेजा जाएगा संभालने है।
इसलिए जब ग्राहक पेलोड बॉडी भेज सकते हैं, सर्वरों को इसे छोड़ देना चाहिए और एपीआई को उन अनुरोधों पर पेलोड बॉडी के लिए सिमेंटिक को परिभाषित नहीं करना चाहिए।
यह परिभाषित नहीं है ।
DELETE अनुरोध संदेश के भीतर एक पेलोड कोई परिभाषित शब्दार्थ नहीं है; DELETE अनुरोध पर पेलोड बॉडी भेजने से अनुरोध को अस्वीकार करने के लिए कुछ मौजूदा कार्यान्वयन हो सकते हैं।
https://tools.ietf.org/html/rfc7231#page-29
एक बॉडी के साथ DELETE का उपयोग करना जोखिम भरा है ... मैं REST पर सूची संचालन के लिए इस दृष्टिकोण को प्राथमिकता देता हूं:
नियमित संचालन
GET / वस्तुएं / सभी वस्तुओं हो जाता है
GET / ऑब्जेक्ट / ID निर्दिष्ट ID के साथ एक ऑब्जेक्ट हो जाता है
पोस्ट / ऑब्जेक्ट एक नई वस्तु जोड़ता है
PUT / ऑब्जेक्ट / ID निर्दिष्ट आईडी के साथ एक वस्तु जोड़ता है, एक वस्तु को अपडेट करता है
DELETE / ऑब्जेक्ट / ID निर्दिष्ट आईडी के साथ ऑब्जेक्ट को हटाता है
सभी कस्टम क्रियाएं POST हैं
POST / वस्तुओं / AddList शरीर में शामिल वस्तुओं की एक सूची या सरणी जोड़ता है
POST / ऑब्जेक्ट्स / डिलीट डिलीट बॉडी में शामिल ऑब्जेक्ट्स की एक सूची को हटाता है
POST / ऑब्जेक्ट्स / customQuery शरीर में कस्टम क्वेरी के आधार पर एक सूची बनाता है
यदि कोई ग्राहक आपके विस्तारित ऑपरेशन का समर्थन नहीं करता है तो वे नियमित रूप से काम कर सकते हैं।
POST
नए संसाधनों को बनाने के लिए a का उपयोग करना एक अच्छा RESTy तरीका नहीं है क्योंकि POST प्रतिक्रियाओं का शब्दार्थ स्पष्ट नहीं है, विशेष रूप से स्थान हेडर के संदर्भ में। आप अनिवार्य रूप से HTTP को पीछे छोड़ रहे हैं और शीर्ष पर RPC को रोकते हैं। उचित "HTTP / REST रास्ता" PUT
डब्ल्यू / If-None-Match: *
हेडर (या उचित HTTP विधियों को देखना, MKCOL
आदि देखना ) का उपयोग करके संसाधन बनाना है ।
मुझे नहीं लगता कि इसका कोई अच्छा जवाब पोस्ट किया गया है, हालांकि मौजूदा उत्तरों पर बहुत सारी शानदार टिप्पणियां हैं। मैं उन टिप्पणियों के सार को एक नए उत्तर में उठाऊंगा:
RFC7231 के इस पैराग्राफ को कुछ बार उद्धृत किया गया है, जो इसे योग करता है।
DELETE अनुरोध संदेश के भीतर एक पेलोड कोई परिभाषित शब्दार्थ नहीं है; DELETE अनुरोध पर पेलोड बॉडी भेजने से अनुरोध को अस्वीकार करने के लिए कुछ मौजूदा कार्यान्वयन हो सकते हैं।
अन्य उत्तरों से मुझे जो याद आया वह निहितार्थ था। हां, यह DELETE
अनुरोधों पर एक निकाय को शामिल करने की अनुमति है , लेकिन यह अर्थहीन रूप से अर्थहीन है। इसका वास्तव में मतलब यह है कि DELETE
अनुरोध निकाय के साथ एक अनुरोध जारी करना शब्दगत रूप से अनुरोध निकाय को शामिल नहीं करने के बराबर है।
एक अनुरोध निकाय को शामिल करने से अनुरोध पर कोई प्रभाव नहीं पड़ना चाहिए, इसलिए इसमें शामिल होने का कोई मतलब नहीं है।
tl; dr: तकनीकी रूप DELETE
से एक अनुरोध निकाय के साथ अनुरोध की अनुमति है, लेकिन ऐसा करना कभी उपयोगी नहीं होता है।
यदि कोई इस मुद्दे की जाँच में भाग ले रहा है, तो यह सार्वभौमिक रूप से समर्थित नहीं है।
मैं वर्तमान में साही प्रो के साथ परीक्षण कर रहा हूं और यह बहुत स्पष्ट रूप से एक http DELETE कॉल स्ट्रिप्स है जो किसी भी प्रदान किए गए शरीर के डेटा (आईडीपॉइंट के अनुसार थोक में हटाने के लिए आईडी की एक बड़ी सूची) है।
मैं उनके साथ कई बार संपर्क में रहा हूं और साथ ही तीन अलग-अलग पैकेज के स्क्रैप, चित्र, लॉग इन के लिए उन्हें समीक्षा के लिए भेजा गया है और उन्होंने अभी भी इसकी पुष्टि नहीं की है। एक असफल पैच, और बाद में उनके समर्थन से एक मिस्ड कॉन्फ्रेंस कॉल और मुझे अभी भी एक ठोस जवाब नहीं मिला है।
मुझे यकीन है कि साही इसका समर्थन नहीं करता है, और मुझे लगता है कि कई अन्य उपकरण सूट का पालन करेंगे।
नीचे हो सकता है GitHUb url आपकी मदद करेगा, जवाब पाने के लिए। दरअसल, Tomcat, Weblogic जैसे एप्लिकेशन सर्वर अनुरोध पेलोड के साथ HTTP.DELETE कॉल से इनकार करते हैं। इसलिए इन सभी बातों को ध्यान में रखते हुए, मैंने जीतूब में उदाहरण जोड़ा है, कृपया इस पर एक नज़र डालें
मैं एक अनुरोध निकाय के साथ DELETE संचालन को लागू करने में सक्षम था। मैंने AWS लैम्ब्डा और AWS API गेटवे का उपयोग किया और गो भाषा का उपयोग किया।