Warum gibt es keine PUT- und DELETE-Methoden für HTML-Formulare?

265

HTML4 / XHTML1 erlaubt nur GET und POST in Formularen, jetzt scheint HTML5 dasselbe zu tun. Es gibt einen Vorschlag, diese beiden hinzuzufügen, aber es scheint nicht an Boden zu gewinnen. Was waren die technischen oder politischen Gründe, um PUT und DELETE nicht in den HTML5-Spezifikationsentwurf aufzunehmen?

FilipK
quelle
7
HTML ist die Auszeichnungssprache, HTTP ist das Protokoll
Ratchet Freak
51
@ratchet Freak: Mir ist das bewusst. Trotzdem frage ich speziell nach HTML, da es nur GET und POST als erlaubte <form>Methoden definiert.
FilipK
Ein typisches Szenario ist ein Formular mit Tabellendaten, bei dem der Benutzer mehr Zeilen eingeben muss oder nicht, da "mehr Zeilen" die Benutzerentscheidung sind. Die Verwendung von Javascript + POST ist künstlich, vielleicht zeigt HTML6 eine alternative FORM-Funktion, um diese Art von Operation durchzuführen.
Peter Krauss
Ich diese Frage beantworten , wenn jemand anderes es auf Stack - Überlauf gefragt, und das Gefühl , meinen Beitrags dort hat über die hervorragenden Antworten etwas hinzufügen, für alle diese weit unten auf der Seite zu lesen: o) Warum Browser nicht unterstützen PUT und DELETE - Anfragen und wann werden sie
Nicholas Shanks
4
ist das noch gültig w3.org/TR/form-http-extensions/#http-delete-form
Jeff Puckett

Antworten:

348

Das ist eine faszinierende Frage. Die anderen Antworten hier sind alle spekulativ und in einigen Fällen völlig falsch. Anstatt meine Meinung hier zu schreiben, habe ich ein paar Nachforschungen angestellt und Originalquellen gefunden, die erläutern, warum Löschen und Einfügen nicht Teil des HTML5-Formularstandards sind.

Wie sich herausstellt, sind diese Methoden wurden in enthalten mehrere, frühe HTML5 Entwürfe (!), Wurden aber später in den entfernten folgenden Entwürfen . Mozilla hatte dies auch in einer Firefox-Beta implementiert .

Was war der Grund, diese Methoden aus dem Entwurf zu entfernen? Das W3C hat dieses Thema im Fehlerbericht 10671 diskutiert . Mike Amundsen sprach sich für diese Unterstützung aus:

Das Ausführen von PUT und DELETE zum Ändern von Ressourcen auf dem Ursprungsserver ist für moderne Webbrowser mit dem XmlHttpRequest-Objekt unkompliziert. Für unskriptierte Browserinteraktionen ist dies nicht so einfach. [...]

Dieses Muster ist so oft erforderlich, dass mehrere häufig verwendete Web-Frameworks / -Bibliotheken eine "integrierte" Problemumgehung erstellt haben. [...]

Andere Überlegungen:

  • Die Verwendung von POST als Tunnel anstelle von PUT / DELETE kann zu Caching- Abweichungen führen (z. B. POST-Antworten können zwischengespeichert werden , PUT-Antworten sind nicht (6), DELETE-Antworten sind nicht (7)).
  • Die Verwendung einer nicht-idempotenten Methode (POST) zur Durchführung einer idempotenten Operation (PUT / DELETE) erschwert die Wiederherstellung aufgrund von Netzwerkfehlern (z. B. "Ist es sicher, diese Aktion zu wiederholen?").
  • [...]

Es lohnt sich, seinen gesamten Beitrag zu lesen.

Tom Wardrop macht auch einen interessanten Punkt:

HTML ist untrennbar mit HTTP verbunden. HTML ist die menschliche Schnittstelle von HTTP. Es ist daher automatisch fraglich, warum HTML nicht alle relevanten Methoden in der HTTP-Spezifikation unterstützt. Warum können Maschinen Ressourcen PUT und DELETE, Menschen jedoch nicht? [...]

Es ist widersprüchlich, dass HTML zwar große Anstrengungen unternimmt, um ein semantisches Markup sicherzustellen, aber bislang keine derartigen Anstrengungen unternommen hat, um semantische HTTP-Anforderungen sicherzustellen.

Der Fehler wurde schließlich von Ian Hickson als Won't Fix geschlossen.

PUT als Formularmethode macht keinen Sinn, Sie möchten keine Formular-Payload PUT. DELETE ist nur dann sinnvoll, wenn keine Payload vorhanden ist. Daher ist es auch bei Formularen nicht sinnvoll.

Dies ist jedoch noch nicht das Ende der Geschichte! Das Problem wurde im W3C-Bug-Tracker geschlossen und zum HTML Working Group-Issue-Tracker eskaliert :

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

Derzeit scheint der Hauptgrund, warum diese Methoden nicht unterstützt werden, darin zu liegen, dass sich niemand die Zeit genommen hat, eine umfassende Spezifikation dafür zu schreiben.

Mark E. Haase
quelle
70
+1 für die Einrichtung des Forschungsaufwands und das Ausgraben einer Reihe von externen Referenzen, um die Frage richtig zu beantworten.
6
@shivakumar Ich denke, was Sie wirklich fragen, ist, warum Sie sich mit HTML beschäftigen, wenn JavaScript den Job bereits erledigen kann? Das ist eine faire Frage. Ich denke, die Frage des OP kommt eher von einem Ort der Neugier als von der Praktikabilität. HTML und HTTP sind zwei Standards, die füreinander geschaffen wurden, und dennoch scheint HTML einige der grundlegendsten Eigenschaften von HTTP nicht zu kennen. "Warum?" ist eine natürliche Frage.
Mark E. Haase
23
Sicherlich müssen Sie eine Nutzlast für PUT einfügen und für DELETE ist es möglich? Auch wenn "mit Formularen nicht viel Sinn macht", warum fragen die Leute danach und warum tun sie viel, wenn er Software-Workarounds eingebaut hat. Seltsam, wie eine Person einfach entscheiden kann, was der Rest der Welt braucht oder will ...
Jonathan.
4
@mehaase Vielleicht bin es auch nur ich, aber ich denke, Mailinglisten sind ein viel besserer Ort für Diskussionen, als die allgemeine Unterstützung eines Vorschlags auszudrücken. Ich bin nicht geneigt, einen neuen Thread in der Mailingliste "public-html-comments" zu erstellen, nur damit ich sagen kann: "Ich mag diesen Vorschlag, Formulare sollten andere HTTP-Methoden verwenden können." Als jemand, der im modernen Web aufgewachsen ist, möchte ich wissen: "Wo ist der Upvote-Button?" ;-)
Ajedi32
6
@ Ajedi32 hier ist der Beitrag: lists.w3.org/Archives/Public/public-html/2015Feb/0000.html Ich ermutige alle Interessierten, auf diesen Beitrag in der public-html-Mailingliste zu antworten.
Mark E. Haase
12

GET und POST haben eine klare inhaltsneutrale Begründung. GET besteht darin, den Inhalt einer URL so abzurufen, dass er wiederholt und möglicherweise zwischengespeichert werden kann. POST ist, etwas auf eine Weise zu tun, die nicht sicher ist, um es zu wiederholen, spekulativ auszuführen oder zwischenzuspeichern.

Es gab keine ähnlichen Gründe für PUT oder DELETE. Sie sind beide vollständig durch POST abgedeckt. Das Erstellen oder Zerstören einer Ressource sind Vorgänge, deren Wiederholung und spekulative Ausführung nicht sicher sind und die nicht zwischengespeichert werden sollten. Für sie ist keine zusätzliche spezielle Semantik erforderlich.

Grundsätzlich gibt es also keinen Nutzen.

David Schwartz
quelle
22
Obwohl POST PUT und DELETE abdeckt, kann ich immer noch den Vorteil sehen, getrennte Methoden zu haben. Alle von ihnen werden in der HTTP-Spezifikation behandelt, und ihre Verwendung wird in REST empfohlen.
FilipK
10
@ David: Das wäre ein Feature .
Donal Fellows
15
Das Grundprinzip ist, dass POST und DELETE unterschiedliche - fast entgegengesetzte - Bedeutungen haben. Sie behaupten, dass POST DELETE vollständig abdeckt, POST jedoch nicht idempotent ist und DELETE. Wie erklären Sie das? w3.org/Protocols/rfc2616/rfc2616-sec9.html
Mark E. Haase
14
Clevere Analogie, aber Sie definieren neu, was "Deckung" bedeutet. In Ihrer ursprünglichen Antwort meinen Sie "Covers" wie in "Unterstützt alle gleichen Anwendungsfälle". Hier definieren Sie "Abdeckungen" neu, um eine Art taxonomische Beziehung zu bezeichnen. Lassen Sie uns die Sprache durchschneiden: POST unterstützt aufgrund der unterschiedlichen Idempotenz nicht dieselben Anwendungsfälle wie DELETE. GET unterstützt aufgrund der unterschiedlichen Semantik nicht dieselben Anwendungsfälle wie DELETE. Die Unterstützung von DELETE würde die Funktionalität des Benutzeragenten erhöhen.
Mark E. Haase
13
Ich bin mit dieser Antwort nicht einverstanden. POSTist nicht idempotent. Wenn Sie in Ihrem Browser auf "Zurück" klicken, wird eine hässliche Seite angezeigt, die besagt, dass das Formular erneut gesendet werden muss. Allerdings war es ein gewesen PUT, könnte es sicher die erneut PUTAnforderung angezeigt werden, was Seite sollten Sie erhalten. Vorausgesetzt, man bringt die API nicht durch das Erstellen einer Art durcheinander DELETE /resource/latest.
20.
12

Dies wurde im Jahr 2010 gemeldet, da Bug 10671 die Unterstützung von PUT und DELETE als Formularmethoden in Betracht zieht .

Es gab ein mäßiges Ausmaß an Pushback für dieses "Feature" und ein gewisses Maß an Überheblichkeit, aber schließlich eskalierte dies als zwei Probleme im Bug-Tracker der Arbeitsgruppen:

Das Problem ISSUE-196 führte zu einer übereinstimmenden Entscheidung, die Spezifikation nicht zu ändern, da die HTML-Spezifikation derzeit nicht die Behandlung von Antworten auf POST-Anforderungen einschränkt. Ich glaube, dieses spezielle Problem wurde beim Versuch aufgeworfen, häufig verwendete POST-Umleitungsmuster abzugleichen und wie ReSTful-Server häufig 2xx-Antworten mit Kurznachrichten versehen, anstatt etwas Nützliches, das in einem Browser wiedergegeben werden kann.

Die Ausgabe ISSUE-195 wurde den Lehrstühlen vorgestellt. Cameron Jones hat am 18. Januar 2012 freiwillig einen Änderungsvorschlag verfasst, der am 29. Mai 2014 als erster Arbeitsentwurf eingereicht wurde . Der Entwurf wird den W3C-Empfehlungsprozess durchlaufen .

Mit etwas Glück wird dies bald zu einer W3C-Empfehlung, die von Browserverkäufern implementiert wird. Dies wäre ein großer Fortschritt beim Entfernen der Blocker, um einheitliche, semantische und browserfreundliche ReSTful-Dienste zu erstellen. Ich stelle mir vor, dass dies eine interessante Entwicklung der Servicemuster auslösen wird. Es gibt einen guten Vortrag von Jon Moore - Hypermedia-APIs, die es wert sind, gesehen zu werden. Dies hat mein Interesse geweckt, ist aber bei der ersten Hürde (dieser) umgefallen.

Stuart Wakefield
quelle
5

Nach meinem Verständnis wissen Browser nicht, was sie tun sollen, wenn sie ein PUT oder ein DELETE senden. Ein POST leitet normalerweise auf eine entsprechende Seite um, PUT und DELETE normalerweise nicht. Dies macht sie für den Aufruf über Ajax oder ein natives Programm geeignet, jedoch nicht über ein Webbrowser-Formular.

Ich kann es momentan nicht verhindern, aber ich erinnere mich, dass ich eine der HTML5-Mailinglisten gelesen habe, als sie darüber diskutierten.

maxpolun
quelle
4
Gibt es einen Grund, warum PUT und DELETE nicht wie POST umleiten können oder nicht?
Ryan H
3
@maxpolun Dies ist wahrscheinlich die Mailingliste, auf die Sie sich beziehen: lists.w3.org/Archives/Public/public-html-wg-issue-tracking/…
jordanbtucker
2
@ RyanH gibt es nicht. Jede App, auf die ich gestoßen bin und die eine Löschanforderung sendet, antwortet mit einer Weiterleitung zum Index.
Qwertie
5

Geschichte

Ich denke, es lohnt sich, das erste Auftreten von HTML-Formularen im RFC1866 (Abschnitt 8.1) zu erwähnen . Hier ist das Methodenattribut wie folgt definiert:

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

Weitere Erläuterungen finden Sie in Abschnitt 8.2.2 - GET und Abschnitt 8.2.3 - POST

Beachten Sie, dass HTML 2.0 (Nov. 1995) vor HTTP 1.0 (Mai 1996) angegeben wurde. Alle verwendeten HTTP also nur mit GET (ab HTTP 0.9) oder mit der Erweiterung POST. PUT und DELETE werden jedoch nur von wenigen Webservern unterstützt (wie im HTTP 1.0-Anhang angegeben ).

Gedanken

Wenn Sie darüber nachdenken, wie sich Berners-Lees Entwicklung des Semantic Web hätte entwickeln können, scheint es klar zu sein, dass es von tatsächlichen Problemen zu einem allgemeinen Konzept übergegangen ist. Zuerst wollte er Dokumente teilen. Deshalb brauchte er Markup. Dann wollte er Datenbanken nach Inhalten abfragen, also brauchte er Formulare. Dann wollte er neue Daten in die Datenbank stellen. Also verwendete er Formulare mit GET und POST. Danach hat er möglicherweise erkannt, dass Sie jede CRUD-Operation für Daten von einem entfernten Standort ausführen können. Daher wurde HTTP erweitert, jedoch nie HTML, da es zu spät war (nur wenige Server unterstützten die neuen CRUD-Operationen).

schmijos
quelle
-2

Nur eine wilde Vermutung, aber wahrscheinlich, weil HTTP im besten Fall nicht besonders gut für die Zugriffskontrolle ist, und das Letzte, was jeder braucht, sind noch mehr Möglichkeiten für böswillige URLs, eine schlecht gesicherte Website und / oder Anwendung zu kompromittieren.

HTTP ist kein wirklich gutes Protokoll für Dateiübertragungen außer dem Herunterladen vom Server zum Client. Verwenden Sie FTP - oder noch besser SFTP.

Shadur
quelle
12
Sicherheit hat darauf keinen Einfluss. Sie können weiterhin PUT / Delete-Anfragen über HTTP stellen. curl --request PUT http://A.B.c/indexDie Frage ist, warum Sie über HTML auf diese Befehle zugreifen können.
Martin York
5
-1 Wilde Vermutungen sind bei SO im Allgemeinen nicht hilfreich.
Mark E. Haase
-4

Get und Post sind Formate zum Übertragen der Daten der Anforderung.

Ich nehme an, Sie fragen nach der Übermittlung von Formularen an einen RESTFUL-Dienst. Es ist jedoch nicht sinnvoll, den http-Anforderungsstandard zu ändern, um Annahmen zum Zweck der http-Anforderung zu machen. Informationen über den Zweck, den die Anforderung erfüllt, werden am besten in den Eingabefeldern verarbeitet.

Wenn der Server eine Adresse hat und diese abruft und veröffentlicht, kann er die Anforderung und ihre Eingabewerte korrekt interpretieren. Von dort aus können Sie mit den Eingabewerten offene Anforderungen an den Server senden und tun, was immer Sie möchten. Zum Beispiel können Sie ein Feld haben, dessen Werte "put" und "delete" sind

Joe
quelle
5
-1 "Get und Post sind Formate zum Übertragen der Daten der Anforderung." Nein, es handelt sich um HTTP-Methoden, nicht um "Formate".
Mark E. Haase