Mengapa tidak ada metode PUT dan DELETE pada formulir HTML?

265

HTML4 / XHTML1 hanya memungkinkan GET dan POST dalam bentuk, sekarang sepertinya HTML5 akan melakukan hal yang sama. Ada proposal untuk menambahkan keduanya tetapi tampaknya tidak mendapatkan daya tarik. Apa alasan teknis atau politik untuk tidak memasukkan PUT dan DELETE dalam konsep spesifikasi HTML5?

Filipk
sumber
7
HTML adalah bahasa markup, HTTP adalah protokol
ratchet freak
51
@ scratchet freak: Saya sadar akan hal itu. Namun demikian saya bertanya secara spesifik tentang HTML karena hanya mendefinisikan GET dan POST sebagai <form>metode yang diizinkan .
Filipk
Skenario khas adalah formulir dengan data tabular, di mana pengguna perlu PUT lebih banyak garis atau tidak, karena "lebih banyak garis" adalah keputusan pengguna. Menggunakan Javascript + POST adalah buatan, mungkin HTML6 akan menampilkan fitur FORM alternatif untuk melakukan operasi semacam ini.
Peter Krauss
Saya menjawab pertanyaan ini ketika orang lain menanyakannya di Stack Overflow, dan merasakan kontribusi saya di sana memiliki sesuatu untuk ditambahkan ke respons luar biasa di atas, bagi siapa saja yang membaca sejauh ini di halaman: o) Mengapa browser tidak mendukung permintaan PUT dan DELETE dan kapan mereka akan
Nicholas Shanks
4
apakah ini masih berlaku? w3.org/TR/form-http-extensions/#http-delete-form
Jeff Puckett

Jawaban:

348

Ini pertanyaan yang menarik. Jawaban lain di sini semuanya spekulatif, dan dalam beberapa kasus tidak benar. Alih-alih menulis pendapat saya di sini, saya malah melakukan riset dan menemukan sumber-sumber asli yang membahas mengapa delete and put bukan bagian dari standar bentuk HTML5.

Ternyata, metode ini dimasukkan dalam beberapa, konsep HTML5 awal (!), Tetapi kemudian dihapus dalam konsep berikutnya . Mozilla sebenarnya telah mengimplementasikan ini dalam Firefox beta juga.

Apa alasan untuk menghapus metode ini dari konsep? W3C membahas topik ini dalam laporan bug 10671 . Mike Amundsen berpendapat mendukung dukungan ini:

Menjalankan PUT dan DELETE untuk memodifikasi sumber daya pada server asal adalah mudah untuk browser Web modern menggunakan objek XmlHttpRequest. Untuk interaksi browser tanpa naskah ini tidak sesederhana itu. [...]

Pola ini diperlukan begitu sering sehingga beberapa kerangka kerja / pustaka Web yang umum digunakan telah menciptakan "built-in" work-around. [...]

Pertimbangan lain:

  • Menggunakan POST sebagai terowongan alih-alih menggunakan PUT / HAPUS dapat mengarah pada caching yang tidak cocok (mis. Respons POST dapat di- cachable , respons PUT tidak (6), respons DELETE tidak (7))
  • Menggunakan metode non-idempoten (POST) untuk melakukan operasi idempoten (PUT / DELETE) mempersulit pemulihan karena kegagalan jaringan (mis. "Apakah aman untuk mengulangi tindakan ini?").
  • [...]

Perlu membaca seluruh posnya.

Tom Wardrop juga membuat poin yang menarik:

HTML terikat dengan HTTP. HTML adalah antarmuka manusia HTTP. Karena itu, secara otomatis dipertanyakan mengapa HTML tidak mendukung semua metode yang relevan dalam spesifikasi HTTP. Mengapa mesin PUT dan HAPUS sumber daya, tetapi manusia tidak bisa? [...]

Ini kontradiktif bahwa sementara HTML berusaha keras untuk memastikan markup semantik, ia sampai saat ini tidak melakukan upaya untuk memastikan permintaan HTTP semantik.

Bug itu akhirnya ditutup sebagai Tidak Akan Diperbaiki oleh Ian Hickson, dengan alasan berikut:

PUT sebagai metode formulir tidak masuk akal, Anda tidak ingin PUT formulir muatan. HAPUS hanya masuk akal jika tidak ada payload, jadi tidak masuk akal dengan formulir juga.

Namun, itu bukan akhir dari cerita! Masalah ini ditutup pada pelacak bug W3C dan meningkat ke pelacak masalah Kelompok Kerja HTML:

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

Pada titik ini, tampaknya alasan utama mengapa tidak ada dukungan untuk metode ini adalah karena tidak ada yang meluangkan waktu untuk menulis spesifikasi komprehensif untuk itu.

Mark E. Haase
sumber
70
+1 untuk menempatkan upaya penelitian di tempat dan menggali sejumlah referensi eksternal untuk menjawab pertanyaan dengan benar.
6
@shivakumar Saya pikir apa yang sebenarnya Anda tanyakan adalah mengapa repot-repot dengan HTML ketika JavaScript sudah bisa melakukan pekerjaannya? Itu pertanyaan yang wajar. Saya kira pertanyaan OP lebih banyak berasal dari rasa ingin tahu daripada kepraktisan. HTML dan HTTP adalah dua standar yang dibuat untuk satu sama lain, namun HTML tampaknya tidak mengetahui beberapa properti paling dasar HTTPs. "Mengapa?" adalah pertanyaan alami untuk ditanyakan.
Mark E. Haase
23
Tentunya Anda harus memasukkan muatan untuk PUT dan untuk HAPUS itu mungkin? Juga jika "tidak masuk akal dengan bentuk" maka mengapa orang memintanya dan mengapa banyak jika perangkat lunak yang dia kerjakan dibangun. Aneh bagaimana satu orang dapat memutuskan apa yang dibutuhkan atau diinginkan oleh seluruh dunia ...
Jonathan.
4
@mease Juga, mungkin hanya saya, tapi saya pikir milis adalah tempat yang jauh lebih baik untuk diskusi daripada untuk mengekspresikan dukungan umum dari sebuah proposal. Saya tidak cenderung memulai utas baru di milis publik-html-komentar supaya saya bisa mengatakan "Saya suka proposal ini; formulir harus dapat menggunakan metode HTTP lain". Sebagai seseorang yang tumbuh di web modern, yang ingin saya ketahui adalah: "di mana tombol upvote?" ;-)
Ajedi32
6
@ Ajedi32 inilah posnya: lists.w3.org/Archives/Public/public-html/2015Feb/0000.html Saya mendorong semua orang yang tertarik untuk membalas posting ini di milis public-html.
Mark E. Haase
12

GET dan POST memiliki dasar pemikiran konten-netral yang jelas. GET adalah untuk mengambil konten dari suatu URL dengan cara yang aman untuk diulang dan mungkin di-cache. POST adalah melakukan sesuatu dengan cara yang tidak aman untuk diulang, dieksekusi secara spekulatif, atau cache.

Tidak ada alasan serupa untuk PUT atau DELETE. Keduanya sepenuhnya tercakup oleh POST. Menciptakan atau menghancurkan sumber daya adalah operasi yang tidak aman untuk diulang, tidak aman untuk dieksekusi secara spekulatif, dan tidak boleh di-cache. Tidak ada semantik khusus tambahan yang diperlukan untuk mereka.

Jadi pada dasarnya tidak ada manfaatnya.

David Schwartz
sumber
22
Meskipun POST mencakup PUT dan DELETE, saya masih dapat melihat manfaat dari memiliki metode terpisah. Semuanya tercakup dalam spesifikasi HTTP dan penggunaannya dianjurkan dalam REST.
Filipk
10
@ David: Itu akan menjadi fitur .
Donal Fellows
15
Alasannya adalah bahwa POST dan DELETE memiliki makna yang berbeda - hampir berseberangan. Anda mengklaim bahwa POST sepenuhnya mencakup DELETE, namun POST tidak idempoten dan DELETE adalah. Bagaimana Anda menjelaskannya? w3.org/Protocols/rfc2616/rfc2616-sec9.html
Mark E. Haase
14
Analogi yang cerdik, tetapi Anda mendefinisikan kembali apa yang dimaksud "penutup". Dalam jawaban awal Anda, maksud Anda "mencakup" seperti pada, "mendukung semua kasus penggunaan yang sama". Di sini Anda mendefinisikan kembali "selimut" berarti semacam hubungan taksonomi. Mari kita bahas bahasa: POST tidak mendukung kasus penggunaan yang sama dengan DELETE karena perbedaan idempotensi. GET tidak mendukung kasus penggunaan yang sama dengan DELETE karena perbedaan semantik. Dukungan untuk DELETE akan meningkatkan fungsionalitas agen pengguna.
Mark E. Haase
13
Saya tidak setuju dengan jawaban ini. POSTadalah tidak idempoten yang mengapa ketika Anda klik "kembali" di browser Anda, maka akan muncul halaman jelek yang mengatakan bentuk kebutuhan untuk dikirim ulang. Namun , jika itu adalah PUT, itu bisa dengan aman mengirim ulang PUTpermintaan untuk menampilkan halaman apa pun yang harus Anda dapatkan. Asalkan tentu saja orang tidak mengacaukan API dengan membuat semacam DELETE /resource/latest.
arg20
12

Ini dibesarkan pada 2010 karena Bug 10671 mempertimbangkan untuk menambahkan dukungan untuk PUT dan HAPUS sebagai metode formulir .

Ada sedikit pushback untuk "fitur" ini dan sedikit kesewenang-wenangan tetapi akhirnya ini meningkat sebagai dua masalah pada pelacak bug Kelompok Kerja:

Masalah ISSUE-196 menghasilkan keputusan konsensus untuk tidak melakukan perubahan pada spesifikasi karena spesifikasi HTML saat ini tidak membatasi bagaimana tanggapan terhadap permintaan POST ditangani. Saya percaya masalah khusus ini muncul dalam upaya untuk mendamaikan pola pengalihan POST yang umum digunakan dan bagaimana server RESTful sering memberikan respons 2xx dengan pesan singkat daripada sesuatu yang berguna untuk dirender di browser.

Masalah MASALAH 195 disajikan ke kursi. Cameron Jones melangkah menjadi sukarelawan dalam menulis proposal perubahan pada tanggal 18 Januari 2012 yang ia ajukan untuk menjadi draft kerja pertama pada tanggal 29 Mei 2014. Draft tersebut akan melalui proses rekomendasi W3C .

Dengan sedikit keberuntungan, ini akan segera menjadi rekomendasi W3C dan diimplementasikan oleh vendor browser, dan akan menjadi langkah maju yang baik dalam menghilangkan blocker untuk menghasilkan layanan ReSTful yang bersatu, semantik dan ramah browser. Saya membayangkan ini akan memicu evolusi yang menarik dalam pola layanan. Ada pembicaraan baik oleh Jon Moore - Hypermedia APIs layak ditonton, ini menarik minat saya tetapi jatuh pada rintangan pertama (yang ini).

Stuart Wakefield
sumber
5

Pemahaman saya adalah bahwa browser tidak tahu apa yang harus dilakukan setelah mereka mengirim PUT atau DELETE. POST biasanya akan dialihkan ke halaman yang sesuai, tetapi PUT dan DELETE biasanya tidak. Ini membuat mereka sesuai untuk menelepon melalui ajax atau program asli, tetapi tidak dari bentuk browser web.

Saya tidak dapat mencegahnya sekarang, tapi saya ingat pernah membaca salah satu milis html5 ketika mereka mendiskusikan hal ini.

maxpolun
sumber
4
Apakah ada alasan bahwa PUT dan DELETE tidak bisa atau tidak mengarahkan dengan cara yang sama seperti POST?
Ryan H
3
@maxpolun Ini mungkin milis yang Anda maksud: lists.w3.org/Archives/Public/public-html-wg-issue-tracking/…
jordanbtucker
2
@RyanH Tidak ada. Setiap aplikasi yang saya temui yang mengirimkan permintaan penghapusan akan membalas dengan pengalihan ke indeks.
Qwertie
5

Sejarah

Saya pikir layak menyebutkan penampilan pertama dari bentuk html di RFC1866 (Bagian 8.1) . Di sini atribut metode didefinisikan sebagai berikut:

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".

Penjelasan lebih lanjut terdapat di Bagian 8.2.2 - GET dan Bagian 8.2.3 - POST

Perlu diingat, bahwa HTML 2.0 (November 1995) telah ditentukan sebelum HTTP 1.0 (Mei 1996). Jadi semua orang menggunakan HTTP hanya dengan GET (pada HTTP 0.9) atau dengan ekstensi POST. Tetapi hanya beberapa server web yang mendukung PUT dan DELETE (seperti yang disebutkan dalam Lampiran HTTP 1.0 ).

Pikiran

Jika Anda berpikir tentang bagaimana perkembangan web semantik Berners-Lee dapat berevolusi, tampak jelas bahwa itu berubah dari masalah aktual menjadi konsep umum. Pertama dia ingin berbagi dokumen. Karena itu ia perlu markup. Kemudian dia ingin meminta database untuk konten, jadi dia membutuhkan formulir. Kemudian dia ingin memasukkan data baru ke dalam database. Jadi dia menggunakan formulir dengan GET dan POST. Setelah itu dia mungkin menyadari bahwa Anda dapat melakukan setiap operasi CRUD pada data dari jarak jauh, sehingga HTTP diperpanjang tetapi tidak pernah HTML karena sudah terlambat (hanya beberapa server yang mendukung operasi CRUD baru).

schmijos
sumber
-2

Hanya membuang tebakan liar, tetapi mungkin karena HTTP tidak terlalu bagus dengan kontrol akses pada saat terbaik, dan hal terakhir yang dibutuhkan semua orang adalah lebih banyak cara bagi URL jahat untuk berkompromi dengan situs web dan / atau aplikasi yang tidak aman.

HTTP sebenarnya bukan protokol yang baik untuk transfer file selain mengunduh dari server ke klien. Gunakan FTP - atau lebih baik lagi, SFTP.

Shadur
sumber
12
Keamanan tidak ada hubungannya dengan ini. Anda masih dapat membuat PUT / Hapus permintaan melalui HTTP. curl --request PUT http://A.B.c/indexPertanyaannya adalah mengapa Anda bisa mengakses perintah-perintah ini melalui HTML.
Martin York
5
-1 Tebakan liar pada umumnya tidak membantu pada SO.
Mark E. Haase
-4

Dapatkan dan kirim adalah format pengiriman data permintaan.

Saya kira Anda bertanya tentang membuat pengiriman formulir ke layanan RESTFUL. Tetapi tidak masuk akal untuk mengubah standar permintaan http untuk membuat asumsi tujuan permintaan http. Informasi tentang tujuan yang diisi permintaan paling baik ditangani di bidang input.

Memiliki alamat dan mendapatkan dan memposting memungkinkan server untuk menginterpretasikan permintaan dan itu memasukkan nilai dengan benar. Dari sana, nilai input memungkinkan Anda untuk membuat permintaan terbuka ke server dan melakukan apa pun yang Anda inginkan. Misalnya, Anda dapat memiliki bidang yang nilainya "dimasukkan" dan "dihapus"

Joe
sumber
5
-1 "Dapatkan dan kirim adalah format pengiriman data permintaan." Tidak, itu adalah metode HTTP, bukan "format".
Mark E. Haase