Apakah metode PUT, DELETE, HEAD, dll tersedia di sebagian besar browser web?

608

Saya telah melihat beberapa pertanyaan di sekitar sini seperti Cara men-debug layanan yang tenang , yang menyebutkan:

Sayangnya browser yang sama tidak memungkinkan saya untuk menguji HTTP PUT, DELETE, dan sampai tingkat tertentu bahkan HTTP POST.

Saya juga mendengar bahwa browser hanya mendukung GET dan POST, dari beberapa sumber lain seperti:

Namun, beberapa tes cepat di Firefox menunjukkan bahwa pengiriman PUTdan DELETEpermintaan berfungsi seperti yang diharapkan - XMLHttpRequestpenyelesaiannya berhasil, dan permintaan tersebut muncul di log server dengan metode yang tepat. Apakah ada beberapa aspek yang saya lewatkan, seperti kompatibilitas lintas-browser atau batasan yang tidak jelas?

John Millikin
sumber
1
Bukan hanya klien yang perlu Anda khawatirkan, banyak kerangka kerja sisi server hanya mendukung GET dan POST.
Derby
7
John, ada alasan Anda tidak ingin tag REST?
John Saunders
11
Meskipun orang-orang yang membaca ini cenderung menyelidiki API RESTful.
Djeckeck
Tidak, semua browser tidak mendukung metode PUT / DELETE, dan juga tidak semua teknologi sisi server tidak mendukung PUT / DELETE. Hanya browser yang didukung HTML 5 yang mendukung PUT / DELETE.
Jani Devang

Jawaban:

463

Tidak. HTML 5 spec menyebutkan:

Atribut metode dan metode format adalah atribut yang disebutkan dengan kata kunci dan status berikut:

Kata kunci dapatkan , pemetaan ke status GET, yang menunjukkan metode HTTP GET. Metode GET seharusnya hanya meminta dan mengambil data dan seharusnya tidak memiliki efek lain.

Posting kata kunci , pemetaan ke POST negara, menunjukkan metode HTTP POST. Metode POST meminta server menerima data formulir yang dikirimkan untuk diproses, yang dapat mengakibatkan item ditambahkan ke database, pembuatan sumber daya halaman web baru, pembaruan halaman yang ada, atau semua hasil yang disebutkan. .

Dialog kata kunci , pemetaan ke dialog negara, menunjukkan bahwa mengirimkan formulir dimaksudkan untuk menutup kotak dialog di mana formulir menemukan sendiri, jika ada, dan sebaliknya tidak mengirimkan.

Nilai default yang tidak valid untuk atribut ini adalah status GET

Yaitu bentuk HTML hanya mendukung GET dan POST sebagai metode permintaan HTTP. Solusi untuk ini adalah untuk tunnel metode lain melalui POST dengan menggunakan bidang formulir tersembunyi yang dibaca oleh server dan permintaan dikirim sesuai.

Namun, GET , POST , PUT dan DELETE yang didukung oleh implementasi dari XMLHttpRequest (yaitu AJAX panggilan) di semua web browser utama (IE, Firefox, Safari, Chrome, Opera).

Matthew Murdoch
sumber
170
Tidak, maksud saya pasti HTML (Saya berbicara tentang kemampuan HTML form walaupun itu mungkin tidak jelas dari teks - saya akan mengeditnya)
Matthew Murdoch
6
@ Matthew: apakah ini berarti bahwa jika saya menggunakan IE6 atau IE7, dengan yang berikut: - <form .. method = "PUT"> ... </form> itu tidak akan berfungsi karena PUT tidak berlaku untuk HTML 4?
Pure.Krome
6
@ Pure.Krome (hanya 14 bulan kemudian) Tidak, Anda tidak dapat melakukan <form method = "put"> atau <form method = "delete"> di bawah spesifikasi HTML 4.01. Hanya GET dan POST yang didukung oleh IE8, Chrome3, atau FF3.5.
Jarrett Meyer
23
@porneL @Alan HTML5 menambahkannya, lalu menghapusnya. Saat ini hanya GET dan POST yang diizinkan. goo.gl/8EuZk
Adam Lassek
13
@porneL HTML5 menambahkannya, lalu menghapusnya, dan sekarang bug dibuka kembali. Menariknya, saya telah melihat beberapa dokumentasi yang masih ada di sana. Inilah bug jika Anda ingin mengikuti di rumah: w3.org/Bugs/Public/show_bug.cgi?id=10671
Emil Lerch
79

Formulir HTML mendukung GET dan POST. (HTML5 pada satu titik menambahkan PUT / HAPUS, tetapi itu dibatalkan.)

XMLHttpRequest mendukung setiap metode, termasuk AYAM, meskipun beberapa nama metode dicocokkan dengan case-insensitive (metode adalah case-sensitive per HTTP) dan beberapa nama metode tidak didukung sama sekali untuk alasan keamanan (misalnya CONNECT).

Peramban secara perlahan melakukan konvergensi pada aturan yang ditentukan oleh XMLHttpRequest, tetapi seperti komentar lain menunjukkan masih ada beberapa perbedaan.

Anne
sumber
5
Draf HTML5 terbaru tampaknya telah menjatuhkan dukungan PUT dan DELETE: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan Tilkov
3
Draf telah diusulkan untuk mendapatkannya kembali: amundsen.com/examples/put-delete-forms
Joost Baaij
26
AYAM? Burung? Saya kira maksud Anda CHECKIN. Itu swap vokal yang lucu.
JayC
52
Tidak, saya maksud AYAM, menggambarkan itu bisa apa saja yang Anda suka. Setuju tentang swap vokal menjadi lucu :-)
Anne
6
Bagi mereka yang sama bingungnya
n0nag0n
43

XMLHttpRequest adalah objek standar dalam model Obyek JavaScript.

Menurut Wikipedia, XMLHttpRequestpertama kali muncul di Internet Explorer 5 sebagai objek ActiveX, tetapi sejak itu telah dibuat menjadi standar dan telah dimasukkan untuk digunakan dalam JavaScript dalam keluarga Mozilla sejak 1.0, Apple Safari 1.2, Opera 7.60-p1, dan IE 7.0 .

The open()metode pada objek mengambil Metode HTTP sebagai argumen - dan ditetapkan sebagai mengambil metode HTTP yang valid (lihat item nomor 5 link) - termasuk GET, POST, HEAD, PUTdan DELETE, seperti yang ditentukan oleh RFC 2616 .

Sebagai catatan, IE 7–8 hanya mengizinkan metode HTTP berikut: "DAPATKAN", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "PROPPATCH", "MKCOL" , "COPY", "LOCK", "UNLOCK", dan "OPTIONS" .

Vihung
sumber
7
Saya berharap untuk melihat beberapa lembar dokumentasi untuk dibaca lebih lanjut, saya tidak mengatakan saya tidak percaya Anda. Tautan di wikipedia sebenarnya cukup bagus. Terima kasih
naugtur
19

_method solusi bidang tersembunyi

Digunakan di Rails dan bisa disesuaikan dengan kerangka kerja apa pun:

  • tambahkan _methodparameter tersembunyi ke formulir apa pun yang bukan GET atau POST:

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

    Ini dapat dilakukan secara otomatis dalam kerangka kerja melalui metode pembantu penciptaan HTML (misalnya Rails form_tag)

  • perbaiki metode form aktual ke POST ( <form method="post")

  • memproses _methoddi server dan melakukan persis seolah-olah metode itu telah dikirim, bukan POST yang sebenarnya

Dasar pemikiran / sejarah mengapa itu tidak mungkin: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
Santilli, hai teman baik sudah lama sejak Anda menawarkan solusi ini, dan karena saya seorang pemula dalam pengembangan web saya punya pertanyaan yang saya harap Anda akan menjawab. Jadi, Anda mengatakan bahwa "memproses _method di server dan melakukan persis seolah-olah metode itu telah dikirim dan bukan POST yang sebenarnya" maksud Anda bahwa jika metode tersembunyi dengan PUT (atau HAPUS) dimasukkan ke dalam tampilan, itu sebenarnya berarti PUT (atau HAPUS) permintaan, kan? jika ya lalu mengapa menggunakan metode POST di awal dan kemudian gunakan PUT atau DELETE yang tersembunyi. Apa hubungan antara POST dan PUT (atau DELETE) :)
Mirich
1
@Mirich formulir hanya mendukung POST. Jadi kami mengirim POST dengan data tambahan, yang diketahui server artinya: ah, saya harus memperlakukan ini seperti PUT.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Terima kasih Ciro atas perhatian dan balasan Anda, jadi dapatkah saya mempertimbangkan skenario ini seperti ini: POST adalah hal universal yang menyimpan POST, PUT, PATCH, dan DELETE yang sebenarnya di dalam dirinya sendiri dan jika Anda menggunakan POST di awal tanpa disembunyikan maka itu berarti aktual POS. Tetapi jika Anda menggunakan POST dengan hidden (PUT atau DELETE) maka Anda memberi tahu server bahwa Anda ingin menggunakan PUT atau DELETE yang ada di dalam POST sebagai anak-anak di dalamnya. Saya tahu analogi yang aneh tapi apakah itu benar? :)
Mirich
1
@Mirich ya, saya pikir Anda sudah mendapatkan idenya.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
maaf Ciro hanya hal terakhir, saya bertanya-tanya mengapa PUT dan DELETE dihapus dari HTML5 karena tidak akan lebih baik jika Anda bisa menggunakan PUT atau DELETE di awal tag bentuk dan tidak menggunakan tersembunyi. Tolong bisa Anda jelaskan dengan singkat dan jelas apa alasan sebenarnya untuk penghapusan PUT dan DELETE. Terima kasih sebelumnya :)
Mirich
15

Saya percaya komentar-komentar itu merujuk secara khusus ke browser, yaitu mengklik tautan dan mengirimkan formulir, bukan XMLHttpRequest. XMLHttpRequesthanyalah klien khusus yang Anda tulis dalam JavaScript yang menggunakan browser sebagai runtime.

UPDATE: Untuk memperjelas, saya tidak bermaksud (meskipun saya menulis) bahwa Anda menulis XMLHttpRequest; Maksud saya, Anda menulis kode yang digunakan XMLHttpRequest. Browser tidak mendukung secara asli XMLHttpRequest. XMLHttpRequestberasal dari JavaScript runtime, yang mungkin dihosting oleh browser, meskipun tidak diharuskan (lihat Badak ). Itu sebabnya orang mengatakan browser tidak mendukung PUTdan DELETE— karena sebenarnya JavaScript yang mendukungnya.

Hank Gay
sumber
XMLHttpRequest adalah objek standar dalam model Obyek JavaScript.
Jacob Krall
9
@ Jacob Benar, tetapi browser yang berbeda memiliki mesin JavaScript yang berbeda. Mengetahui mana yang mendukung PUT masih membantu.
senfo
1
it's actually JavaScript that is supporting them. Tidak sepenuhnya benar. XMLHttpRequestadalah 'host-object', artinya objek yang mengekspos fungsionalitas dari host ke kode Javascript. Itu bukan bagian dari JS itu sendiri.
Stijn de Witt
9

YA , PUT, HAPUS, KEPALA, dll. Metode HTTP tersedia di semua peramban modern.

Agar sesuai dengan browser Level 2 XMLHttpRequest harus mendukung metode ini. Untuk memeriksa browser mana yang mendukung XMLHttpRequest Level 2, saya sarankan CanIUse:

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

Hanya Opera Mini yang kekurangan dukungan atm (juli '15), tetapi Opera Mini tidak memiliki dukungan untuk semuanya. :)

Stijn de Witt
sumber
7

Hanya untuk menambahkan - Safari 2 dan sebelumnya jelas tidak mendukung PUT dan DELETE. Saya mendapatkan kesan 3 lakukan, tetapi saya tidak memilikinya untuk menguji lagi. Safari 4 jelas mendukung PUT dan DELETE.

jharlap
sumber
5
Adakah yang bisa mengkonfirmasi versi Safari mana yang mendapatkan dukungan untuk PUT dan DELETE?
mjs
1
Adakah yang bisa menjelaskan jika semua browser SEKARANG mendukung PUT & DELETE - dan kira-kira berapa lama ini telah tersedia. Memperhatikan contoh "AYAM", apakah ini berarti sepenuhnya tergantung pada server untuk menafsirkan metode mana yang digunakan DAN bahwa JavaScript tidak membatasi jenis metode ...?
Cody