HTML फॉर्म में कोई PUT और DELETE तरीके क्यों नहीं हैं?


265

HTML4 / XHTML1 रूपों में केवल GET और POST की अनुमति देता है, अब ऐसा लगता है कि HTML5 ऐसा ही करेगा। नहीं है जोड़ने के लिए एक प्रस्ताव इन दो लेकिन यह कर्षण प्राप्त कर रहा हो प्रतीत नहीं होता है। HTML5 विनिर्देश ड्राफ्ट में PUT और DELETE को शामिल नहीं करने के तकनीकी या राजनीतिक कारण क्या थे?


7
HTML मार्कअप लैंग्वेज है, HTTP प्रोटोकॉल है
शाफ़्ट फ्रीक

51
@ हर्षित की लकीर: मुझे इस बात की जानकारी है। फिर भी मैं विशेष रूप से HTML के बारे में पूछ रहा हूं क्योंकि यह अनुमत <form>तरीकों के रूप में केवल GET और POST को परिभाषित करता है ।
फिलिप

एक विशिष्ट परिदृश्य सारणीबद्ध डेटा के साथ एक रूप है, जहां उपयोगकर्ता को अधिक लाइनों को PUT करने की आवश्यकता होती है या नहीं, क्योंकि "अधिक लाइनें" उपयोगकर्ता का निर्णय है। जावास्क्रिप्ट + POST का उपयोग करना कृत्रिम है, शायद HTML6 इस तरह के ऑपरेशन को करने के लिए एक वैकल्पिक FORM सुविधा दिखाएगा।
पीटर क्रस

मैंने इस सवाल का जवाब दिया जब किसी और ने इसे स्टैक ओवरफ्लो पर पूछा, और मेरे योगदान को महसूस करें कि ऊपर दिए गए उत्कृष्ट प्रतिक्रियाओं को जोड़ने के लिए कुछ है, पेज को नीचे पढ़ने वाले किसी व्यक्ति के लिए: ओ) ब्राउज़र्स PUT और DELETE अनुरोधों का समर्थन क्यों नहीं करते हैं और वे कब आएंगे
निकोलस शैंक्स

4
क्या यह अभी भी वैध है? w3.org/TR/form-http-extensions/#http-delete-form
जेफ पकेट

जवाबों:


348

यह एक आकर्षक प्रश्न है। यहाँ अन्य उत्तर सभी अटकलें हैं, और कुछ मामलों में फ्लैट-आउट गलत हैं। यहाँ मेरी राय लिखने के बजाय, मैं वास्तव में कुछ शोध किया और मूल स्रोतों यही कारण है कि विचार-विमर्श पाया हटाना और पुट एचटीएमएल 5 प्रपत्र मानक का हिस्सा नहीं हैं।

यह पता चला है के रूप में, इन तरीकों रहे थे में शामिल कई, जल्दी एचटीएमएल 5 ड्राफ्ट (!), लेकिन बाद में हटा दिया गया बाद में ड्राफ्ट । मोज़िला ने वास्तव में फ़ायरफ़ॉक्स बीटा में भी इसे लागू किया था ।

मसौदे से इन तरीकों को हटाने के लिए तर्क क्या था? W3C ने बग रिपोर्ट 10671 में इस विषय पर चर्चा की । माइक अमुंडसेन ने इस समर्थन के पक्ष में तर्क दिया:

मूल सर्वर पर संसाधनों को संशोधित करने के लिए PUT और DELETE को निष्पादित करना XmlHttpRequest ऑब्जेक्ट का उपयोग करके आधुनिक वेब ब्राउज़र के लिए सीधे-आगे है। बिना स्क्रिप्ट के ब्राउज़र इंटरैक्शन के लिए यह इतना सरल नहीं है। [...]

इस पैटर्न की इतनी बार आवश्यकता होती है कि कई सामान्य रूप से उपयोग किए जाने वाले वेब फ्रेमवर्क / लाइब्रेरीज़ ने एक "बिल्ट-इन" वर्क-अराउंड बनाया है। [...]

अन्य बातें:

  • PUT / DELETE का उपयोग करने के बजाय POST को एक सुरंग के रूप में उपयोग करने से कैसिंग मिस-मैच हो सकते हैं (जैसे POST प्रतिक्रियाएं अस्वीकार्य हैं , PUT प्रतिक्रियाएं नहीं हैं (6), DELETE प्रतिक्रियाएं नहीं हैं (7))
  • एक idempotent ऑपरेशन (PUT / DELETE) करने के लिए एक नॉन-इम्पोटेंट विधि (POST) का उपयोग करके नेटवर्क विफलताओं के कारण रिकवरी को जटिल बनाता है (उदाहरण के लिए "इस क्रिया को दोहराने के लिए सुरक्षित है?")।
  • [...]

यह उनकी पूरी पोस्ट पढ़ने लायक है।

टॉम वार्ड्रॉप भी एक दिलचस्प बिंदु बनाता है:

एचटीएमएल HTTP का अटूट बंधन है। HTML HTTP का मानव इंटरफ़ेस है। इसलिए यह स्वचालित रूप से संदिग्ध है कि HTML HTTP विनिर्देश में सभी प्रासंगिक विधियों का समर्थन क्यों नहीं करता है। PUT और DELETE संसाधनों को क्यों मशीन कर सकती है, लेकिन मनुष्य नहीं कर सकते? [...]

यह विरोधाभासी है कि एचटीएमएल सिमेंटिक मार्कअप सुनिश्चित करने के लिए बड़ी लंबाई तक जाता है, लेकिन सिमेंटिक HTTP अनुरोधों को सुनिश्चित करने के लिए ऐसा कोई प्रयास नहीं करना पड़ता है।

बग को अंतत : राशन के साथ, इयान हिकसन द्वारा वैट फिक्स के रूप में बंद नहीं किया गया था :

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

हालाँकि, यह कहानी का अंत नहीं है! इस समस्या को W3C बग ट्रैकर में बंद कर दिया गया था और HTML वर्किंग ग्रुप इश्यू ट्रैकर को बढ़ा दिया गया था :

https://www.w3.org/html/wg/tracker/issues/195

इस बिंदु पर, ऐसा लगता है कि इन तरीकों के लिए कोई समर्थन नहीं होने का मुख्य कारण यह है कि किसी ने भी इसके लिए एक व्यापक विनिर्देश लिखने के लिए समय नहीं लिया है।


70
अनुसंधान के प्रयास को जगह देने और प्रश्न का ठीक से जवाब देने के लिए कई बाहरी संदर्भों को खोदने के लिए +1।

6
@ शिवकुमार मुझे लगता है कि आप वास्तव में पूछ रहे हैं कि HTML से परेशान क्यों है जब जावास्क्रिप्ट पहले से ही काम कर सकता है? यह एक उचित सवाल है। मुझे लगता है कि ओपी का सवाल व्यावहारिकता की तुलना में जिज्ञासा की जगह से अधिक आता है। HTML और HTTP एक दूसरे के लिए दो मानक हैं, और फिर भी HTML HTTP के कुछ मूल गुणों से अनजान है। "क्यों?" एक स्वाभाविक सवाल है।
मार्क ई। हासे

23
निश्चित रूप से आपको PUT के लिए पेलोड शामिल करना होगा और DELETE के लिए यह संभव है? इसके अलावा अगर "फॉर्म के साथ बहुत ज्यादा समझदारी नहीं है" तो लोग इसके लिए क्यों पूछ रहे हैं और अगर वह सॉफ्टवेयर का निर्माण करता है तो बहुत कुछ क्यों करता है। अजीब बात है कि एक व्यक्ति सिर्फ यह तय कर सकता है कि बाकी दुनिया को क्या चाहिए या क्या चाहिए ...
जोनाथन।

4
@mehaase इसके अलावा, शायद यह सिर्फ मेरे लिए है, लेकिन मुझे लगता है कि प्रस्ताव की सामान्य सहायता व्यक्त करने की तुलना में मेलिंग सूचियां चर्चा के लिए एक बेहतर जगह हैं। मैं सार्वजनिक-html- टिप्पणियों की मेलिंग सूची पर एक नया सूत्र शुरू करने के लिए इच्छुक नहीं हूं, इसलिए मैं कह सकता हूं "मुझे यह प्रस्ताव पसंद है; प्रपत्र अन्य HTTP तरीकों का उपयोग करने में सक्षम होना चाहिए"। जैसा कि कोई है जो आधुनिक वेब पर बड़ा हुआ है, मैं जो जानना चाहता हूं वह है: "जहां अपवोट बटन है?" ;-)
Ajedi32

6
@ Ajedi32 यहाँ पोस्ट है: lists.w3.org/Archives/Public/public-html/2015Feb/0000.html मैं उन सभी को प्रोत्साहित करता हूं, जो सार्वजनिक-HTML मेलिंग सूची में इस पोस्ट का उत्तर देने के इच्छुक हैं।
मार्क ई। हासे

12

GET और POST में एक स्पष्ट सामग्री-तटस्थ तर्क है। जीईटी एक URL की सामग्री को इस तरह से पुनः प्राप्त करना है जो दोहराना और संभवतः कैश करना सुरक्षित है। POST कुछ इस तरह से करना है जो दोहराना, सट्टा या कैश को निष्पादित करने के लिए सुरक्षित नहीं है।

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

तो मूल रूप से कोई लाभ नहीं है।


22
यद्यपि POST PUT और DELETE को कवर करता है, फिर भी मैं अलग-अलग विधियाँ होने का लाभ देख सकता हूँ। वे सभी HTTP विनिर्देश में शामिल हैं और उनका उपयोग REST में प्रोत्साहित किया जाता है।
फिलिप

10
@ डेविड: यह एक विशेषता होगी
डोनल फैलो

15
तर्क यह है कि POST और DELETE के अलग - लगभग विपरीत अर्थ हैं। आप दावा करते हैं कि POST पूरी तरह से DELETE को कवर करता है, फिर भी POST बेकार नहीं है और DELETE है। आप उसे कैसे समझायेंगे? w3.org/Protocols/rfc2616/rfc2616-sec9.html
मार्क ई।

14
चालाक सादृश्य, लेकिन आप फिर से परिभाषित कर रहे हैं कि "कवर" का क्या मतलब है। अपने मूल उत्तर में, आप का अर्थ है "कवर" के रूप में, "सभी एक ही उपयोग के मामलों का समर्थन करता है"। यहाँ आप "कवर" को पुनर्परिभाषित कर रहे हैं, जिसका अर्थ है कि कुछ प्रकार के करात्मक संबंध। आइए भाषा के माध्यम से कटौती करते हैं: POST, समान उपयोग के मामलों का समर्थन नहीं करता है क्योंकि आलस्य में अंतर के कारण DELETE होता है। विभिन्न शब्दार्थों के कारण GET DELETE के समान उपयोग के मामलों का समर्थन नहीं करता है। DELETE के लिए समर्थन उपयोगकर्ता एजेंट कार्यक्षमता को बढ़ाएगा।
ई। में मार्क ई। हासे

13
मैं इस जवाब से असहमत हूं। POSTऐसा नहीं है जिसके कारण जब आप अपने ब्राउज़र में "बैक" पर क्लिक करते हैं, तो यह एक बदसूरत पृष्ठ प्रदर्शित करेगा जो कहता है कि फॉर्म को नाराज होने की आवश्यकता है। हालाँकि , यह एक था PUT, यह सुरक्षित रूप PUTसे जो भी पृष्ठ आपको मिलना चाहिए प्रदर्शित करने के अनुरोध को फिर से भेज सकता है । निश्चित रूप से एक तरह से बनाकर एपीआई को गड़बड़ नहीं करता है DELETE /resource/latest
arg20

12

इसे 2010 में उठाया गया था, क्योंकि बग 10671 ने PUT और DELETE के लिए फार्म के तरीकों के समर्थन को जोड़ने पर विचार किया था

इस "फ़ीचर" और कुछ भारी-भरकम कामों के लिए मध्यम मात्रा में पुशबैक था लेकिन अंततः वर्किंग ग्रुप्स बग ट्रैकर पर इसे दो मुद्दों के रूप में आगे बढ़ाया गया:

समस्या ISSUE-196 के परिणामस्वरूप विनिर्देशन में कोई परिवर्तन नहीं करने के लिए सहमति का निर्णय लिया गया क्योंकि HTML विनिर्देश वर्तमान में प्रतिबंधित नहीं है कि POST अनुरोधों के लिए कैसे प्रतिक्रियाएं नियंत्रित की जाती हैं। मेरा मानना ​​है कि इस विशेष मुद्दे को आमतौर पर उपयोग में आने वाले POST रीडायरेक्ट पैटर्न को समेटने के प्रयास में उठाया गया था और कैसे ReSTful सर्वर अक्सर एक ब्राउज़र में प्रदान किए जाने वाले कुछ उपयोगी के बजाय छोटे संदेशों के साथ 2xx प्रतिक्रियाएं प्रदान करते हैं।

मुद्दा ISSUE-195 कुर्सियों के लिए प्रस्तुत किया गया था। कैमरन जोन्स ने 18 जनवरी 2012 को एक परिवर्तन प्रस्ताव लिखने के लिए स्वयंसेवक की ओर कदम बढ़ाया, जिसे उन्होंने 29 मई 2014 को पहला कार्य मसौदा बनने के लिए प्रस्तुत किया । यह मसौदा डब्ल्यू 3 सी सिफारिशों की प्रक्रिया से गुजरेगा

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


5

मेरी समझ में यह है कि ब्राउज़रों को यह नहीं पता होता है कि एक बार PUT या DELETE भेजने के बाद उन्हें क्या करना है। एक पोस्ट आमतौर पर एक उपयुक्त पृष्ठ पर पुनर्निर्देशित करेगा, लेकिन PUT और DELETE आमतौर पर नहीं करते हैं। यह उन्हें अजाक्स या एक देशी कार्यक्रम के माध्यम से कॉल करने के लिए उपयुक्त बनाता है, लेकिन वेब ब्राउज़र फॉर्म से नहीं।

मैं इसे अभी रोक नहीं सकता, लेकिन मुझे याद है कि जब वे इस बारे में चर्चा कर रहे थे, तो मुझे html5 मेलिंग सूचियों में से एक पढ़ना था।


4
क्या कोई कारण है कि PUT और DELETE POST के समान तरीके को पुनर्निर्देशित नहीं कर सकते हैं या नहीं कर सकते हैं?
रयान एच

3
@ maxpolun यह संभवतः आपकी मेलिंग सूची है, जिसका आप उल्लेख कर रहे हैं: lists.w3.org/Archives/Public/public-html-wg-issue-tracking/…
jordanbtucker

2
@RyanH वहाँ नहीं है। मैंने जो भी ऐप का सामना किया है वह डिलीट रिक्वेस्ट भेजता है जो इंडेक्स पर रीडायरेक्ट करेगा।
अक्टूबर को क्वर्टी

5

इतिहास

मुझे लगता है कि यह RFC1866 (धारा 8.1) में html रूपों की पहली उपस्थिति के लायक है । यहाँ विधि विशेषता को निम्नलिखित के रूप में परिभाषित किया गया है:

METHOD
        selects a method of accessing the action URI. The set of
        applicable methods is a function of the scheme of the
        action URI of the form. See 8.2.2, "Query Forms:
        METHOD=GET" and 8.2.3, "Forms with Side-Effects:
        METHOD=POST".

इसके अतिरिक्त स्पष्टीकरण धारा 8.2.2 - GET और धारा 8.2.3 - POST में स्थित हैं

ध्यान रखें, एचटीएमएल 2.0 (नवंबर 1995) HTTP 1.0 (मई 1996) से पहले निर्दिष्ट किया गया था । इसलिए हर कोई HTTP का उपयोग केवल GET (HTTP 0.9 के रूप में) या एक्सटेंशन POST के साथ करता है। लेकिन केवल कुछ वेब सर्वर ने PUT और DELETE का समर्थन किया (जैसे HTTP 1.0 परिशिष्ट में बताया गया है )।

विचार

यदि आप इस बारे में सोचते हैं कि बर्नर्स-ली का सिमेंटिक वेब का विकास कैसे हो सकता है, तो यह स्पष्ट प्रतीत होता है कि यह वास्तविक समस्याओं से एक सामान्य अवधारणा तक गया। पहले वह दस्तावेजों को साझा करना चाहता था। इसलिए उसे मार्कअप की जरूरत थी। तब वह डेटाबेस को सामग्री के लिए क्वेरी करना चाहता था, इसलिए उसे प्रपत्रों की आवश्यकता थी। तब वह नया डेटा डेटाबेस में डालना चाहता था। इसलिए उन्होंने GET और POST के साथ फॉर्म का इस्तेमाल किया। उसके बाद उसे महसूस हुआ कि आप रिमोट से डेटा पर हर CRUD ऑपरेशन कर सकते हैं, इसलिए HTTP को विस्तारित किया गया था, लेकिन HTML कभी नहीं था क्योंकि यह बहुत देर हो चुकी थी (केवल कुछ सर्वर नए CRUD ऑपरेशन का समर्थन करते थे)।


-2

बस एक जंगली अनुमान बाहर फेंक, लेकिन शायद इसलिए है क्योंकि HTTP समय की सबसे अच्छे रूप में अभिगम नियंत्रण के साथ बहुत अच्छा नहीं है, और आखिरी बात हर किसी की जरूरत भी है और अधिक दुर्भावनापूर्ण यूआरएल के लिए तरीके एक खराब सुरक्षित वेबसाइट और / या आवेदन समझौता करने।

HTTP सर्वर से क्लाइंट में डाउनलोड करने के अलावा फाइल ट्रांसफर के लिए वास्तव में एक अच्छा प्रोटोकॉल नहीं है। FTP का उपयोग करें - या बेहतर अभी तक, SFTP।


12
इस पर सुरक्षा का कोई असर नहीं है। आप HTTP के माध्यम से अभी भी PUT / Delete अनुरोध कर सकते हैं। curl --request PUT http://A.B.c/indexसवाल यह है कि आप इन कमांडों को HTML के माध्यम से एक्सेस क्यों कर सकते हैं।
मार्टिन यॉर्क

5
-1 जंगली अनुमान आमतौर पर एसओ पर मददगार नहीं होते हैं।
मार्क ई। हासे

-4

प्राप्त करें और पोस्ट अनुरोध के डेटा को प्रसारित करने के प्रारूप हैं।

मुझे लगता है कि आप RESTFUL सेवा में फ़ॉर्म जमा करने के बारे में पूछ रहे हैं। लेकिन यह HTTP अनुरोध के उद्देश्य को मान्य बनाने के लिए http अनुरोध मानक को बदलने के लिए कोई मतलब नहीं है। इस उद्देश्य के बारे में जानकारी कि अनुरोध भरता है सबसे अच्छा इनपुट क्षेत्रों में नियंत्रित किया जाता है।

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


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