ทำไมไม่มีวิธี 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.