ทำไมไม่มีวิธี PUT และ DELETE ในแบบฟอร์ม HTML?


265

HTML4 / XHTML1 อนุญาตเฉพาะ GET และ POST ในรูปแบบตอนนี้ดูเหมือนว่า HTML5 จะทำเช่นเดียวกัน มีข้อเสนอให้เพิ่มสองสิ่งนี้ แต่ดูเหมือนจะไม่ดึงดูดความสนใจ อะไรคือเหตุผลทางเทคนิคหรือทางการเมืองสำหรับการไม่รวม PUT และ DELETE ในร่างข้อกำหนด HTML5


7
HTML เป็นภาษามาร์กอัป HTTP เป็นโปรโตคอล
— ratchet freak

51
@ วงล้อประหลาด: ฉันรู้ว่า อย่างไรก็ตามฉันถามเฉพาะเกี่ยวกับ HTML เนื่องจากมันกำหนดเพียง GET และ POST เป็น<form>วิธีที่อนุญาต
— ชาวฟิลิปปินส์

สถานการณ์ทั่วไปคือรูปแบบที่มีข้อมูลแบบตารางซึ่งผู้ใช้ต้องการใส่เส้นมากขึ้นหรือไม่เนื่องจาก "เส้นมากขึ้น" เป็นการตัดสินใจของผู้ใช้ การใช้ Javascript + POST นั้นเป็นเรื่องประดิษฐ์บางที HTML6 จะแสดงคุณสมบัติ FORM ทางเลือกในการดำเนินการเช่นนี้
— Peter Krauss

ฉันตอบคำถามนี้เมื่อมีคนถามมันใน Stack Overflow และรู้สึกว่ามีส่วนร่วมของฉันมีบางสิ่งที่จะเพิ่มไปยังการตอบสนองที่ดีเยี่ยมสำหรับทุกคนที่อ่านหน้านี้: o) ทำไมเบราว์เซอร์ไม่สนับสนุนคำขอ PUT และ DELETE พวกเขาจะเมื่อไหร่?
— Nicholas Shanks

4
ยังคงใช้ได้ไหม w3.org/TR/form-http-extensions/#http-delete-form
— Jeff Puckett

คำตอบ:


348

นี่เป็นคำถามที่น่าสนใจ คำตอบอื่น ๆ ที่นี่ล้วนเป็นการเก็งกำไรและในบางกรณีการถอนออกไม่ถูกต้อง แทนที่จะเขียนความคิดเห็นของฉันที่นี่ฉันได้ทำการวิจัยและพบแหล่งต้นฉบับที่กล่าวถึงสาเหตุที่ลบและวางไม่ได้เป็นส่วนหนึ่งของมาตรฐานฟอร์ม HTML5

ตามที่ปรากฎวิธีการเหล่านี้จะรวมอยู่ในร่าง HTML5 ช่วงต้น (!) หลายต้นแต่ถูกลบออกในภายหลังในร่างถัดไป Mozilla ได้นำสิ่งนี้ไปใช้ใน Firefox เบต้าด้วยเช่นกัน

เหตุผลในการลบวิธีการเหล่านี้ออกจากร่างคืออะไร ของ W3C กล่าวถึงหัวข้อนี้ในรายงานข้อบกพร่อง 10671 Mike Amundsen แย้งกับการสนับสนุนนี้:

การดำเนินการ PUT และ DELETE เพื่อแก้ไขทรัพยากรบนเซิร์ฟเวอร์ต้นทางนั้นตรงไปข้างหน้าสำหรับเว็บเบราว์เซอร์ที่ทันสมัยโดยใช้วัตถุ XmlHttpRequest สำหรับการโต้ตอบกับเบราว์เซอร์ที่ไม่ได้กำหนดสิ่งนี้ไม่ง่ายเลย [ ... ]

รูปแบบนี้จำเป็นต้องใช้บ่อยครั้งที่เว็บเฟรมเวิร์ก / ไลบรารีที่ใช้กันทั่วไปหลายรายการได้สร้างการทำงานแบบ "มีอยู่" ภายใน [ ... ]

ข้อควรพิจารณาอื่น ๆ :

  • การใช้โพสต์เป็นอุโมงค์แทนการใช้ใส่ / ลบสามารถนำไปสู่การแคชผิดพลาดการแข่งขัน (เช่นการตอบสนอง POST มีcachableใส่การตอบสนองไม่ได้ (6), ลบการตอบกลับไม่ได้ (7))
  • การใช้วิธีที่ไม่ใช่ idempotent (POST) เพื่อดำเนินการ idempotent (PUT / DELETE) ทำให้การกู้คืนมีความซับซ้อนเนื่องจากความล้มเหลวของเครือข่าย (เช่น "ปลอดภัยต่อการทำซ้ำการกระทำนี้หรือไม่")
  • [ ... ]

มันคุ้มค่าที่จะอ่านโพสต์ทั้งหมดของเขา

Tom Wardrop ทำให้ประเด็นที่น่าสนใจ:

HTML ถูกผูกมัดกับ HTTP อย่างแยกไม่ออก HTML เป็นส่วนต่อประสานกับมนุษย์ของ HTTP ดังนั้นจึงเป็นเรื่องที่น่าสงสัยโดยอัตโนมัติว่าทำไม HTML ไม่สนับสนุนวิธีการที่เกี่ยวข้องทั้งหมดในข้อมูลจำเพาะ HTTP เหตุใดเครื่องจักรจึงสามารถใส่ทรัพยากร PUT และ DELETE แต่มนุษย์ไม่สามารถทำได้ [ ... ]

เป็นเรื่องที่ขัดแย้งกันว่าในขณะที่ HTML มีความยาวมากเพื่อให้แน่ใจว่ามาร์กเกอร์เชิงความหมายจะต้องมีความพยายามในการรับรองคำขอ HTTP ความหมาย

ในที่สุดข้อผิดพลาดก็ถูกปิดในที่สุดเนื่องจากจะไม่แก้ไขโดย Ian Hickson โดยมีเหตุผลดังต่อไปนี้:

ใส่ PUT เป็นวิธีการแบบไม่มีเหตุผลคุณไม่ต้องการใส่แบบฟอร์ม payload ลบเหมาะสมเท่านั้นหากไม่มีน้ำหนักบรรทุกดังนั้นจึงไม่สมเหตุสมผลกับรูปแบบเช่นกัน

อย่างไรก็ตามนั่นไม่ใช่จุดจบของเรื่องราว! ปัญหาที่ถูกปิดในบั๊ก W3C และเพิ่มขึ้นไป HTML คณะทำงานติดตามปัญหา:

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

ณ จุดนี้ดูเหมือนว่าเหตุผลหลักที่ว่าทำไมไม่มีการสนับสนุนสำหรับวิธีการเหล่านี้ก็คือว่าไม่มีใครได้ใช้เวลาในการเขียนข้อกำหนดที่ครอบคลุมสำหรับมัน


70
+1 สำหรับใส่ความพยายามในการวิจัยและขุดแหล่งอ้างอิงภายนอกจำนวนมากเพื่อตอบคำถามอย่างถูกต้อง

6
@shivakumar ฉันคิดว่าสิ่งที่คุณถามจริง ๆ คือทำไมรำคาญกับ HTML เมื่อ JavaScript สามารถทำงานได้แล้ว? นั่นเป็นคำถามที่ยุติธรรม ฉันเดาว่าคำถามของ OP มาจากสถานที่ที่อยากรู้อยากเห็นมากกว่าการใช้งานจริง HTML และ HTTP เป็นมาตรฐานสองมาตรฐานที่สร้างขึ้นมา แต่ HTML ก็ดูเหมือนจะไม่ทราบคุณสมบัติพื้นฐานที่สุดของ HTTP บางตัว "ทำไม?" เป็นคำถามธรรมชาติที่จะถาม
— Mark E. Haase

23
แน่นอนคุณต้องรวม payload สำหรับ PUT และ DELETE เป็นไปได้หรือไม่ นอกจากนี้ถ้า "ไม่ค่อยมีเหตุผลกับแบบฟอร์ม" ทำไมผู้คนถึงถามหามันและทำไมถึงมีจำนวนมากหากซอฟต์แวร์ที่เขาสร้างขึ้นมาแปลก ๆ ว่าใครคนหนึ่งสามารถตัดสินใจได้ว่าคนอื่น ๆ ในโลกต้องการหรือต้องการ ...
— โจนาธาน

4
@mehaase อาจเป็นเพียงฉัน แต่ฉันคิดว่ารายชื่อผู้รับจดหมายเป็นสถานที่ที่ดีกว่าสำหรับการอภิปรายมากกว่าการแสดงความช่วยเหลือทั่วไปของข้อเสนอ ฉันไม่อยากเริ่มหัวข้อใหม่ในรายชื่อผู้รับจดหมายสาธารณะ html ความคิดเห็นเพียงเพื่อให้ฉันสามารถพูดว่า "ฉันชอบข้อเสนอนี้แบบฟอร์มควรจะสามารถใช้วิธีการ HTTP อื่น ๆ " ในฐานะที่เป็นคนที่เติบโตขึ้นมาบนเว็บสมัยใหม่สิ่งที่ฉันต้องการรู้คือ: "ปุ่ม upvote อยู่ที่ไหน" ;-)
— Ajedi32

6
@ Ajedi32 นี่คือโพสต์: lists.w3.org/Archives/Public/public-html/2015Feb/0000.htmlฉันขอแนะนำให้ทุกคนที่สนใจตอบกลับโพสต์นี้ในรายชื่อผู้รับจดหมายสาธารณะ html
— Mark E. Haase

12

GET และ POST มีเหตุผลที่ชัดเจนสำหรับเนื้อหาที่เป็นกลาง GET คือการดึงเนื้อหาของ URL ด้วยวิธีที่ปลอดภัยในการทำซ้ำและอาจเป็นแคช โพสต์คือการทำบางสิ่งบางอย่างในลักษณะที่ไม่ปลอดภัยที่จะทำซ้ำดำเนินการ speculatively หรือแคช

ไม่มีเหตุผลที่คล้ายคลึงกันสำหรับ PUT หรือ DELETE พวกเขาทั้งสองได้รับการคุ้มครองอย่างสมบูรณ์โดย POST การสร้างหรือการทำลายทรัพยากรเป็นการดำเนินการที่ไม่ปลอดภัยในการทำซ้ำไม่ปลอดภัยในการดำเนินการโดยเฉพาะและไม่ควรถูกแคช ไม่มีความหมายพิเศษเพิ่มเติมที่จำเป็นสำหรับพวกเขา

ดังนั้นโดยทั่วไปไม่มีประโยชน์


22
แม้ว่า POST จะครอบคลุม PUT และ DELETE แต่ฉันยังคงเห็นประโยชน์ของการมีวิธีการแยกกัน ทั้งหมดนั้นอยู่ในข้อกำหนด HTTP และสนับสนุนให้ใช้ใน REST
— ชาวฟิลิปปินส์

10
@ David: นั่นจะเป็นคุณลักษณะ
— Donal Fellows

15
เหตุผลก็คือ POST และ DELETE นั้นมีความหมายต่างกันเกือบจะตรงกันข้าม คุณอ้างว่า POST ครอบคลุมการลบอย่างสมบูรณ์ แต่ POST ไม่ใช่ idempotent และ DELETE นั้น คุณอธิบายได้อย่างไร w3.org/Protocols/rfc2616/rfc2616-sec9.html
— Mark E. Haase

14
การเปรียบเทียบที่ฉลาด แต่คุณกำหนดสิ่งที่ "ครอบคลุม" อีกครั้ง ในคำตอบดั้งเดิมของคุณคุณหมายถึง "ครอบคลุม" เหมือนใน "รองรับกรณีการใช้งานเดียวกันทั้งหมด" ที่นี่คุณกำลังนิยาม "ครอบคลุม" ใหม่เพื่อหมายถึงความสัมพันธ์แบบอนุกรมวิธานบางอย่าง มาตัดภาษา: POST ไม่รองรับกรณีการใช้งานเดียวกันกับ DELETE เนื่องจากความแตกต่างของ idempotence GET ไม่รองรับกรณีการใช้งานเดียวกันกับ DELETE เนื่องจากความหมายที่แตกต่างกัน การสนับสนุนสำหรับ DELETE จะเพิ่มฟังก์ชั่นตัวแทนผู้ใช้
— Mark E. Haase

13
ฉันไม่เห็นด้วยกับคำตอบนี้ POSTคือไม่ idempotentซึ่งเป็นเหตุผลที่เมื่อคุณคลิก "กลับ" ในเบราว์เซอร์ของคุณก็จะแสดงหน้าน่าเกลียดที่กล่าวว่ารูปแบบจะต้องไม่พอใจ อย่างไรก็ตามหากเป็นPUTเช่นนั้นก็สามารถส่งPUTคำขออีกครั้งเพื่อแสดงหน้าใดก็ได้ที่คุณควรได้รับ แน่นอนว่าหากไม่ได้ทำให้ API ยุ่งเหยิงด้วยการสร้างสิ่งDELETE /resource/latestใดสิ่งหนึ่ง
— arg20

12

นี้จะถูกยกขึ้นในปี 2010 เป็น10,671 Bug พิจารณาเพิ่มการสนับสนุนสำหรับ PUT และลบเป็นวิธีการรูปแบบ

มีจำนวนการกดย้อนกลับปานกลางสำหรับ "ฟีเจอร์" นี้และการใช้งานหนัก แต่ในที่สุดก็เพิ่มเป็นปัญหาสองประการในตัวติดตามบั๊ก Working Group:

ปัญหาISSUE-196ส่งผลให้มีการตัดสินใจร่วมกันเพื่อทำการเปลี่ยนแปลงข้อกำหนดในขณะที่ข้อกำหนด HTML ไม่ได้ จำกัด วิธีการจัดการการตอบสนองต่อการร้องขอ POST ฉันเชื่อว่าปัญหานี้เกิดขึ้นจากการพยายามปรับรูปแบบการเปลี่ยนเส้นทาง POST ที่ใช้บ่อยและเซิร์ฟเวอร์ ReSTful มักให้การตอบกลับ 2xx พร้อมข้อความสั้นมากกว่าสิ่งที่มีประโยชน์ในการแสดงผลในเบราว์เซอร์

ปัญหาISSUE-195ถูกนำเสนอต่อเก้าอี้ คาเมรอนโจนส์ก้าวขึ้นไปเป็นอาสาสมัครในการเขียนข้อเสนอการเปลี่ยนแปลงใน 18 มกราคม 2012 ที่เขาส่งมาจะกลายเป็นร่างการทำงานครั้งแรกใน 29 พฤษภาคม 2014 ร่างจะไปผ่านกระบวนการคำแนะนำ W3C

ด้วยโชคใด ๆ สิ่งนี้จะกลายเป็นคำแนะนำของ W3C และนำไปใช้โดยผู้จำหน่ายเบราว์เซอร์และจะเป็นขั้นตอนต่อไปที่ยอดเยี่ยมในการลบตัวบล็อกเพื่อให้บริการ ReSTful ที่เป็นมิตรความหมายและเป็นมิตรกับเบราว์เซอร์ ฉันคิดว่านี่จะจุดประกายการวิวัฒนาการที่น่าสนใจในรูปแบบการบริการ มีการพูดคุยที่ดีจากJon Moore - การรับชม Hypermedia API ที่คุ้มค่านี่เป็นสิ่งที่ฉันสนใจ แต่ก็ล้มลงในอุปสรรคแรก (อันนี้)


5

ความเข้าใจของฉันคือเบราว์เซอร์ไม่ทราบว่าต้องทำอย่างไรเมื่อพวกเขาส่ง PUT หรือ DELETE โดยปกติแล้ว POST จะเปลี่ยนเส้นทางไปยังหน้าที่เหมาะสม แต่โดยทั่วไปแล้ว PUT และ DELETE จะไม่ทำเช่นนั้น สิ่งนี้ทำให้พวกเขาเหมาะสมสำหรับการโทรผ่าน ajax หรือโปรแกรมเนทีฟ แต่ไม่ใช่จากเว็บเบราว์เซอร์

ฉันไม่สามารถขัดขวางได้ในตอนนี้ แต่ฉันจำได้ว่าอ่านรายการส่งเมล html5 หนึ่งรายการเมื่อพวกเขาพูดคุยเรื่องนี้


4
มีเหตุผลที่ PUT และ DELETE ไม่สามารถหรือไม่เปลี่ยนเส้นทางแบบเดียวกับ POST หรือไม่
— Ryan H

3
@maxpolun นี่อาจเป็นรายชื่อผู้รับจดหมายที่คุณอ้างถึง: lists.w3.org/Archives/Public/public-html-wg-issue-tracking/ ......
— jordanbtucker

2
@RyanH ไม่มี ทุกแอพที่ฉันพบที่ส่งคำขอลบจะตอบกลับพร้อมการเปลี่ยนเส้นทางไปยังดัชนี
— Qwertie

5

ประวัติศาสตร์

ฉันคิดว่ามันเป็นมูลค่าการกล่าวขวัญปรากฏตัวครั้งแรกในรูปแบบ HTML ในRFC1866 (มาตรา 8.1) ที่นี่แอตทริบิวต์วิธีการที่ถูกกำหนดไว้ดังต่อไปนี้:

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

โปรดทราบว่า HTML 2.0 (พ.ย. 1995) ถูกระบุไว้ก่อน HTTP 1.0 (พฤษภาคม 1996) ดังนั้นทุกคนจึงใช้ HTTP กับ GET เท่านั้น (ตั้งแต่ HTTP 0.9) หรือด้วยส่วนขยาย POST แต่มีเว็บเซิร์ฟเวอร์เพียงไม่กี่ตัวที่รองรับ PUT และ DELETE (เช่นที่ระบุในHTTP 1.0 Appendix )

ความคิด

หากคุณคิดว่าการพัฒนาเว็บเชิงความหมายของ Berners-Lee จะมีวิวัฒนาการมาได้อย่างไรมันก็ชัดเจนว่ามันเกิดจากปัญหาที่แท้จริงไปสู่แนวคิดทั่วไป ก่อนอื่นเขาต้องการแบ่งปันเอกสาร ดังนั้นเขาต้องการมาร์กอัป จากนั้นเขาต้องการสืบค้นฐานข้อมูลสำหรับเนื้อหาดังนั้นเขาจึงต้องการฟอร์ม จากนั้นเขาต้องการที่จะนำข้อมูลใหม่เข้าสู่ฐานข้อมูล ดังนั้นเขาจึงใช้แบบฟอร์มกับ GET และ POST หลังจากนั้นเขาอาจรู้ว่าคุณสามารถดำเนินการ CRUD ทุกครั้งกับข้อมูลจากระยะไกลได้ดังนั้น HTTP จึงถูกขยาย แต่ไม่ใช้ HTML เพราะมันสายเกินไป


-2

เพียงแค่การขว้างปาออกเดาป่า แต่อาจจะเป็นเพราะไม่ได้เป็น HTTP ชะมัดดีกับการควบคุมการเข้าถึงที่ดีที่สุดของครั้งและสิ่งสุดท้ายที่ทุกคนต้องการที่จะยิ่งมากขึ้นวิธีสำหรับ URL ที่เป็นอันตรายที่จะประนีประนอมเว็บไซต์ที่มีความปลอดภัยไม่ดีและ / หรือแอพลิเคชัน

HTTP ไม่ใช่โปรโตคอลที่ดีสำหรับการถ่ายโอนไฟล์นอกเหนือจากการดาวน์โหลดจากเซิร์ฟเวอร์ไปยังไคลเอนต์ ใช้ FTP - หรือดีกว่า SFTP


12
ความปลอดภัยไม่มีผลต่อสิ่งนี้ คุณยังสามารถสร้างคำขอ PUT / Delete ผ่าน HTTP ได้ curl --request PUT http://A.B.c/indexคำถามคือทำไมคุณสามารถเข้าถึงคำสั่งเหล่านี้ผ่านทาง HTML
— Martin York

5
-1 การคาดเดายากโดยทั่วไปไม่เป็นประโยชน์สำหรับ SO
— Mark E. Haase

-4

รับและโพสต์เป็นรูปแบบของการส่งข้อมูลของคำขอ

ฉันคิดว่าคุณกำลังขอให้ส่งแบบฟอร์มลงในบริการ RESTFUL แต่มันก็ไม่สมเหตุสมผลที่จะเปลี่ยนมาตรฐานการร้องขอ http เพื่อให้ข้อสันนิษฐานวัตถุประสงค์ของการร้องขอ http ข้อมูลเกี่ยวกับวัตถุประสงค์ที่คำขอเติมได้รับการจัดการที่ดีที่สุดในฟิลด์อินพุต

มีที่อยู่และรับและโพสต์ช่วยให้เซิร์ฟเวอร์ตีความคำขอและเป็นค่าอินพุตที่ถูกต้อง จากนั้นค่าอินพุตจะอนุญาตให้คุณสร้างคำร้องขอสิ้นสุดที่เปิดไปยังเซิร์ฟเวอร์และทำสิ่งที่คุณต้องการ ตัวอย่างเช่นคุณสามารถมีฟิลด์ที่มีค่าเป็น "put" และ "delete"


5
-1 "การรับและโพสต์เป็นรูปแบบของการส่งข้อมูลของคำขอ" ไม่มันเป็นวิธีการของ HTTP ไม่ใช่ "รูปแบบ"
— Mark E. Haase
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.