มีวิธี PUT, DELETE, HEAD และอื่น ๆ ในเว็บเบราว์เซอร์ส่วนใหญ่หรือไม่?


608

ฉันเคยเห็นคำถามสองสามรอบที่นี่เช่นวิธีการดีบักบริการ RESTfulซึ่งกล่าวถึง:

น่าเสียดายที่เบราว์เซอร์เดียวกันไม่อนุญาตให้ฉันทดสอบ HTTP PUT, DELETE และในระดับหนึ่งแม้แต่ HTTP POST

ฉันเคยได้ยินด้วยว่าเบราว์เซอร์รองรับเฉพาะ GET และ POST จากแหล่งอื่น ๆ เช่น:

อย่างไรก็ตามการทดสอบอย่างรวดเร็วใน Firefox แสดงให้เห็นว่าการส่งPUTและDELETEคำขอทำงานได้ตามที่คาดไว้ - การXMLHttpRequestดำเนินการเสร็จสมบูรณ์และคำขอจะแสดงในบันทึกของเซิร์ฟเวอร์ด้วยวิธีการที่ถูกต้อง มีบางสิ่งที่ฉันขาดหายไปเช่นความเข้ากันได้ข้ามเบราว์เซอร์หรือข้อ จำกัด ที่ไม่ชัดเจนหรือไม่?


1
ไม่ใช่เพียงลูกค้าที่คุณต้องกังวลกรอบด้านเซิร์ฟเวอร์จำนวนมากรองรับ GET และ POST เท่านั้น
ดาร์บี้

7
จอห์นด้วยเหตุผลใดก็ตามที่คุณไม่ต้องการแท็ก REST
จอห์นแซนเดอร์

11
แม้ว่าคนที่อ่านข้อความนี้มีแนวโน้มที่จะตรวจสอบ RESTful API
djjeck


ไม่เบราว์เซอร์ทั้งหมดไม่สนับสนุนวิธีการ PUT / DELETE และเทคโนโลยีด้านเซิร์ฟเวอร์ทั้งหมดไม่รองรับ PUT / DELETE เฉพาะเบราว์เซอร์ที่รองรับ HTML 5 รองรับ PUT / DELETE
Jani Devang

คำตอบ:


463

ไม่ข้อมูลจำเพาะ HTML 5กล่าวถึง:

แอตทริบิวต์เนื้อหาของเมธอดและเมธอด formmethod เป็นแอ็ตทริบิวต์ที่ระบุด้วยคำหลักและสถานะต่อไปนี้:

คำหลักได้รับการจับคู่กับสถานะ GET ระบุวิธี HTTP GET วิธีการ GET ควรร้องขอและดึงข้อมูลและควรไม่มีผลกระทบอื่น

โพสต์คำหลัก, การจับคู่กับสถานะ POST, ระบุวิธีการ HTTP POST เมธอด POST ร้องขอให้เซิร์ฟเวอร์ยอมรับข้อมูลของแบบฟอร์มที่ส่งเพื่อดำเนินการซึ่งอาจส่งผลให้รายการถูกเพิ่มลงในฐานข้อมูลการสร้างทรัพยากรหน้าเว็บใหม่การอัปเดตหน้าเว็บที่มีอยู่หรือผลลัพธ์ที่กล่าวถึงทั้งหมด .

ไดอะล็อกคีย์เวิร์ดการแม็พกับไดอะล็อกสถานะบ่งชี้ว่าการส่งฟอร์มนั้นมีจุดประสงค์เพื่อปิดกล่องโต้ตอบที่ฟอร์มนั้นพบตัวเองถ้ามีและไม่ส่ง

ค่าเริ่มต้นที่ไม่ถูกต้องสำหรับแอตทริบิวต์เหล่านี้คือสถานะ GET

ฟอร์ม HTML คือสนับสนุนGETและPOSTเป็นวิธีการร้องขอ HTTP เท่านั้น วิธีแก้ปัญหาสำหรับสิ่งนี้คือการส่งสัญญาณวิธีอื่น ๆ ผ่าน POST โดยใช้ฟิลด์แบบฟอร์มที่ซ่อนอยู่ซึ่งเซิร์ฟเวอร์อ่านและคำขอที่ส่งไป

อย่างไรก็ตามGET , POST , PUTและDELETE ได้รับการสนับสนุนโดยการใช้งานของ XMLHttpRequest (เช่นการโทร AJAX) ในเว็บเบราว์เซอร์หลักทั้งหมด (IE, Firefox, Safari, Chrome, Opera)


170
ไม่ฉันหมายถึง HTML แน่นอน (ฉันกำลังพูดถึงความสามารถในรูปแบบ HTML แม้ว่าอาจไม่ชัดเจนจากข้อความ - ฉันจะแก้ไข)
Matthew Murdoch

6
@ Matewew: นี่หมายความว่าถ้าฉันใช้ IE6 หรือ IE7 โดยมีสิ่งต่อไปนี้: - <form .. method = "PUT"> ... </form> จะไม่ทำงานเนื่องจาก PUT ไม่ถูกต้องสำหรับ HTML 4 หรือไม่
Pure.Krome

6
@ Pure.Krome (เพียง 14 เดือนต่อมา) ไม่คุณไม่สามารถทำ <form method = "put"> หรือ <form method = "delete"> ภายใต้ข้อกำหนด HTML 4.01 รองรับ GET และ POST เท่านั้นโดย IE8, Chrome3 หรือ FF3.5
Jarrett Meyer

23
@porneL @Alan HTML5 เพิ่มแล้วลบออก ปัจจุบันอนุญาตให้ใช้ GET และ POST เท่านั้น goo.gl/8EuZk
Adam

13
@porneL HTML5 เพิ่มแล้วลบออกและตอนนี้ข้อผิดพลาดจะถูกเปิดใหม่ น่าสนใจฉันเห็นเอกสารบางอย่างที่ยังมีอยู่ในนั้น นี่คือข้อผิดพลาดหากคุณต้องการติดตามที่บ้าน: w3.org/Bugs/Public/show_bug.cgi?id=10671
Emil Lerch

79

แบบฟอร์ม HTML รองรับ GET และ POST (HTML5 ณ จุดหนึ่งเพิ่ม PUT / DELETE แต่ถูกทิ้ง)

XMLHttpRequest รองรับทุกวิธีรวมถึง CHICKEN แม้ว่าบางชื่อวิธีจะถูกจับคู่กับ case-insensitively (เมธอดจะคำนึงถึงขนาดตัวพิมพ์ต่อ HTTP) และชื่อเมธอดบางตัวไม่ได้รับการสนับสนุนด้วยเหตุผลด้านความปลอดภัย (เช่น CONNECT)

เบราว์เซอร์กำลังค่อย ๆ บรรจบกับกฎที่ระบุโดย XMLHttpRequest แต่เนื่องจากความคิดเห็นอื่นที่ชี้ให้เห็นยังคงมีความแตกต่างอยู่บ้าง


5
ดูเหมือนว่าร่าง HTML5 ล่าสุดจะได้รับการสนับสนุน PUT และ DELETE ลดลง: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan Tilkov

3
ร่างจดหมายถูกเสนอให้นำพวกเขากลับมา: amundsen.com/examples/put-delete-forms
Joost Baaij

26
ไก่? นก? ฉันคิดว่าคุณหมายถึง CHECKIN นั่นคือการแลกเปลี่ยนเสียงสระที่ตลก
JayC

52
ไม่ฉันหมายถึงไก่แสดงให้เห็นว่ามันเป็นอะไรก็ได้ที่คุณชอบ มีมติเห็นชอบเกี่ยวกับการแลกเปลี่ยนสระตลกแม้ว่า :-)
แอนน์

6
สำหรับผู้ที่เพิ่งเป็นสับสนขณะที่ผมกำลังกับธุรกิจไก่นี้ .... w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm
n0nag0n

43

XMLHttpRequest เป็นวัตถุมาตรฐานในโมเดล JavaScript Object

ตามที่ Wikipedia ได้XMLHttpRequestปรากฏตัวครั้งแรกใน Internet Explorer 5 ว่าเป็นวัตถุ ActiveX แต่ได้ถูกสร้างขึ้นมาเพื่อเป็นมาตรฐานและถูกรวมไว้เพื่อใช้ใน JavaScript ในตระกูล Mozilla ตั้งแต่ 1.0, Apple Safari 1.2, Opera 7.60-p1 และ IE 7.0 .

open()วิธีการบนวัตถุต้องใช้วิธี HTTP เป็นอาร์กิวเมนต์ - และมีการระบุเป็นวิธีการ HTTP ที่ถูกต้อง (ดูจำนวนรายการที่ 5 ของการเชื่อมโยง) - รวมGET, POST, HEAD, PUTและDELETEเป็นที่ระบุโดย RFC 2616

ตามหมายเหตุด้านIE 7–8 อนุญาตวิธี HTTP ต่อไปนี้เท่านั้น: "GET", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL" "คัดลอก", "LOCK", "ปลดล็อค" และ "ตัวเลือก"


7
ฉันหวังว่าจะได้เห็นเอกสารบางอย่างสำหรับการอ่านเพิ่มเติมฉันไม่ได้บอกว่าฉันไม่เชื่อคุณ ลิงค์ในวิกิพีเดียนั้นค่อนข้างดีจริง ๆ ขอบคุณ
naugtur

19

_method วิธีแก้ปัญหาฟิลด์ที่ซ่อนอยู่

ใช้ใน Rails และสามารถปรับให้เข้ากับกรอบใดก็ได้:

  • เพิ่ม_methodพารามิเตอร์ที่ซ่อนอยู่ให้กับฟอร์มใด ๆ ที่ไม่ใช่ GET หรือ POST:

    <input type="hidden" name="_method" value="DELETE">

    สิ่งนี้สามารถทำได้โดยอัตโนมัติในเฟรมเวิร์กผ่านเมธอดตัวช่วยสร้าง HTML (เช่น Rails form_tag)

  • แก้ไขวิธีการแบบฟอร์มจริงเพื่อ POST ( <form method="post")

  • ประมวลผล_methodบนเซิร์ฟเวอร์และทำตามราวกับว่าวิธีนั้นได้ถูกส่งแทนที่จะเป็น POST จริง

เหตุผล / ประวัติสาเหตุที่ไม่สามารถทำได้: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms


Santilli สวัสดีเพื่อนกันมานานแล้วตั้งแต่คุณเสนอวิธีแก้ปัญหานี้และเนื่องจากฉันเป็นผู้เริ่มต้นในการพัฒนาเว็บไซต์ฉันมีคำถามที่ฉันหวังว่าคุณจะตอบ ดังนั้นคุณบอกว่า "กระบวนการ _method บนเซิร์ฟเวอร์และทำตามราวกับว่าวิธีนั้นถูกส่งแทนที่จะเป็น POST จริง" คุณหมายถึงว่าถ้าใส่วิธีซ่อนด้วย PUT (หรือ DELETE) ในมุมมองจริง ๆ แล้วมันจะหมายถึง PUT (หรือลบ) คำขอใช่ไหม ถ้าใช่แล้วทำไมต้องใช้วิธีการ POST ที่จุดเริ่มต้นแล้วใช้ PUT หรือ DELETE ที่ซ่อนอยู่ มีอะไรเชื่อมต่อระหว่าง POST และวาง (หรือลบ) :) ความ
Mirich

1
@Michich แบบฟอร์มสนับสนุน POST เท่านั้น ดังนั้นเราจึงส่ง POST พร้อมข้อมูลเพิ่มเติมซึ่งเซิร์ฟเวอร์รู้ดีว่าหมายถึง: โอ้ฉันควรปฏิบัติเช่นนี้เหมือนกับ PUT
Ciro Santilli 郝海东冠状病六四事件法轮功

ขอบคุณ Ciro สำหรับความสนใจและการตอบกลับของคุณดังนั้นฉันสามารถพิจารณาสถานการณ์นี้ดังนี้: POST เป็นสิ่งสากลที่มี POST, PUT, PATCH และ DELETE จริงภายในตัวเองและถ้าคุณใช้ POST ที่จุดเริ่มต้นโดยไม่มีการซ่อนไว้ โพสต์ แต่ถ้าคุณใช้ POST กับ hidden (PUT หรือ DELETE) คุณต้องให้เซิร์ฟเวอร์รู้ว่าคุณต้องการใช้ PUT หรือ DELETE ที่อยู่ใน POST เนื่องจากลูก ๆ ของมันอยู่ในนั้นฉันรู้ว่าการเปรียบเทียบค่อนข้างแปลก แต่ถูกต้องหรือไม่ :)
Mirich

1
@Michich yup ฉันคิดว่าคุณได้รับความคิด
Ciro Santilli 郝海东冠状病六四事件法轮功

ขออภัย Ciro เป็นสิ่งสุดท้ายฉันสงสัยว่าทำไม PUT และ DELETE ถูกลบออกจาก HTML5 เพราะจะไม่ดีกว่าถ้าคุณสามารถใช้ PUT หรือ DELETE ที่จุดเริ่มต้นของแท็กแบบฟอร์มและไม่ใช้ซ่อน คุณสามารถอธิบายได้อย่างรวดเร็วและชัดเจนว่าอะไรคือสาเหตุที่แท้จริงสำหรับการลบ PUT และ DELETE ขอขอบคุณล่วงหน้า :)
Mirich

15

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

ปรับปรุง: เพื่อชี้แจงฉันไม่ได้ตั้งใจ (แม้ว่าฉันจะเขียน) ที่คุณเขียนXMLHttpRequest; XMLHttpRequestฉันหมายความว่าคุณเขียนรหัสที่ใช้ เบราว์เซอร์ไม่สนับสนุนXMLHttpRequestตามธรรมชาติ XMLHttpRequestมาจากรันไทม์ JavaScript ซึ่งอาจโฮสต์โดยเบราว์เซอร์แม้ว่าจะไม่จำเป็นต้องเป็น (ดูแรด ) นั่นเป็นสาเหตุที่ผู้คนกล่าวว่าเบราว์เซอร์ไม่สนับสนุนPUTและDELETEเพราะจริงๆแล้วมันเป็นจาวาสคริปต์ที่รองรับพวกเขา


XMLHttpRequest เป็นวัตถุมาตรฐานในรูปแบบวัตถุ JavaScript
Jacob Krall

9
@Jacob True แต่เบราว์เซอร์ที่แตกต่างกันมีเอนจิ้น JavaScript ที่แตกต่างกัน การรู้ว่าคนที่สนับสนุน PUT ยังคงมีประโยชน์
senfo

1
it's actually JavaScript that is supporting them. ไม่จริงเลย XMLHttpRequestเป็น 'host-object' ซึ่งหมายความว่าเป็นวัตถุที่แสดงถึงการทำงานจากโฮสต์ไปยังโค้ด Javascript มันไม่ได้เป็นส่วนหนึ่งของ JS
Stijn de Witt

9

YES , PUT, DELETE, HEAD เป็นต้น HTTP มีให้ใช้งานในเบราว์เซอร์สมัยใหม่ทั้งหมด

เพื่อให้สอดคล้องกับเบราว์เซอร์XMLHttpRequest ระดับ 2 ต้องสนับสนุนวิธีการเหล่านี้ วิธีตรวจสอบว่าเบราว์เซอร์ใดรองรับ XMLHttpRequest ระดับ 2 ฉันขอแนะนำ CanIUse:

http://caniuse.com/#feat=xhr2

มีเพียง Opera Mini เท่านั้นที่ขาดการสนับสนุน atm (juli '15) แต่ Opera Mini ขาดการสนับสนุนทุกอย่าง :)


7

เพื่อเพิ่ม - Safari 2 และก่อนหน้านี้ไม่สนับสนุน PUT และ DELETE ฉันได้รับความประทับใจที่ 3 แต่ฉันไม่ได้มีมันเพื่อทดสอบอีกต่อไป Safari 4 รองรับ PUT และ DELETE อย่างแน่นอน


5
ทุกคนสามารถยืนยันว่า Safari เวอร์ชันใดได้รับการสนับสนุนสำหรับ PUT และ DELETE หรือไม่
mjs

1
ทุกคนสามารถอธิบายรายละเอียดได้ถ้าเบราว์เซอร์ทั้งหมดสนับสนุน PUT & DELETE และประมาณว่ามีให้ใช้ได้นานเท่าไหร่ เมื่อสังเกตจากตัวอย่าง "ไก่" นี่หมายความว่ามันขึ้นอยู่กับเซิร์ฟเวอร์ทั้งหมดในการตีความว่าวิธีใดที่ใช้และ JavaScript นั้นไม่ได้ จำกัด ประเภทของวิธีการ ...
โคดี้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.