HTMLフォームにPUTおよびDELETEメソッドがないのはなぜですか?


265

HTML4 / XHTML1はフォームでGETとPOSTのみを許可しますが、HTML5も同じように見えるようになりました。これら2つを追加する提案がありますが、勢いを増しているようには見えません。HTML5仕様ドラフトにPUTとDELETEを含めない技術的または政治的な理由は何ですか?


7
HTMLはマークアップ言語、HTTPはプロトコルです
ラチェットフリーク

51
@ラチェットフリーク:私はそれを知っています。それにもかかわらず、許可された<form>メソッドとしてGETとPOSTのみを定義しているHTMLについて具体的に尋ねています。
FilipK

典型的なシナリオは、「より多くの行」がユーザーの決定であるため、ユーザーがより多くの行をPUTする必要があるかどうかにかかわらず、表形式のデータを持つフォームです。Javascript + POSTの使用は人為的なものであり、おそらくHTML6はこの種の操作を行うための代替のFORM機能を示します。
ピータークラウス14年

他の誰かがStack Overflowでそれを尋ねたときに私はこの質問に答えましたが、ページのはるか下を読んでいる人のために、上記の優れた応答に何か貢献があると感じています:o)ブラウザがPUTおよびDELETEリクエストをサポートしないのはなぜですか?彼らはいつですか?
ニコラスシャンクス

回答:


348

これは興味深い質問です。ここでの他の答えはすべて投機的であり、場合によっては完全に間違っています。ここで意見を書く代わりに、実際にいくつかの調査を行い、deleteputがHTML5フォーム標準の一部ではない理由を説明する元のソースを見つけました。

結局のところ、これらのメソッドいくつかの初期のHTML5ドラフト(!)に含まれていましたが、その後のドラフトでは削除されました。Mozillaは実際にこれをFirefoxベータ版でも実装していました

これらのメソッドをドラフトから削除する理由は何ですか?W3Cは、バグレポート10671でこのトピックについて議論しました。マイク・アムンセンはこのサポートを支持して主張しました:

XmlHttpRequestオブジェクトを使用する最新のWebブラウザーでは、PUTおよびDELETEを実行してオリジンサーバー上のリソースを変更するのは簡単です。スクリプト化されていないブラウザインタラクションの場合、これはそれほど単純ではありません。[...]

このパターンは非常に頻繁に必要とされるため、一般的に使用されるいくつかのWebフレームワーク/ライブラリが「組み込み」の回避策を作成します。[...]

その他の考慮事項:

  • PUT / DELETEを使用する代わりにPOSTをトンネルとして使用すると、キャッシュの不一致が発生する可能性があります(POST応答はキャッシュ可能、PUT応答はnot(6)、DELETE応答はnot(7))
  • 非べき等メソッド(POST)を使用してべき等操作(PUT / DELETE)を実行すると、ネットワーク障害(たとえば、「このアクションを繰り返しても安全ですか?」)による回復が複雑になります。
  • [...]

彼の投稿全体を読む価値があります。

トムウォードロップも興味深いポイントを挙げています。

HTMLはHTTPと密接に結びついています。HTMLはHTTPのヒューマンインターフェイスです。したがって、HTMLがHTTP仕様のすべての関連メソッドをサポートしていない理由は、自動的に疑問視されます。マシンがリソースをPUTおよびDELETEできるのに、人間はできないのはなぜですか?[...]

セマンティックマークアップを保証するためにHTMLが非常に長くなる一方で、セマンティックHTTPリクエストを保証するための努力をこれまで行っていなかったことは矛盾しています。

バグは最終的に、次の理由でIan HicksonによってWo n't Fixとしてクローズされました。

フォームメソッドとしてのPUTは意味がありません。フォームペイロードをPUTしたくないでしょう。DELETEは、ペイロードがない場合にのみ意味があるため、フォームでもあまり意味がありません。

しかし、それで話は終わりではありません!この問題はW3Cバグトラッカーでクローズされ、HTMLワーキンググループの問題トラッカーにエスカレーションされました。

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

この時点で、これらのメソッドがサポートされていない主な理由は、そのための包括的な仕様を作成するのに時間をかけた人がいないためだと思われます。


70
+1は、研究努力を実施し、質問に適切に回答するために多数の外部参照を掘り下げたためです。

6
@shivakumar JavaScriptがすでに仕事をしているのに、なぜHTMLに煩わされるのか、あなたが本当に求めているのは何だと思いますか?それは公正な質問です。OPの質問は、実用性というより好奇心の場所にあると思います。HTMLとHTTPは相互に作成された2つの標準ですが、HTMLはHTTPの最も基本的なプロパティの一部を認識していないようです。"なぜ?" 当然の質問です。
マークE.ハーセ14

23
確かにPUTのペイロードを含める必要があり、DELETEの場合は可能ですか?また...なぜ人々はそれを求めている「形とあまり意味がありません」と彼は回避策ソフトウェアは1人だけの世界の残りの部分が必要か、何を望んで決定することができますどのように奇妙に建設された場合に、なぜ多くのことをしなければ。
ジョナサン。

4
@mehaaseまた、多分それは私だけかもしれませんが、提案の一般的な支持を表現するよりも、メーリングリストの方が議論のためのはるかに良い場所だと思います。「私はこの提案が好きです。フォームは他のHTTPメソッドを使用できるはずです」と言えるように、public-html-commentsメーリングリストで新しいスレッドを開始するつもりはありません。最新のWebで育った人として、私が知りたいのは、「アップボットボタンはどこですか?」です。;-)
Ajedi32

6
@ Ajedi32の投稿は次のとおりです。lists.w3.org / Archives / Public / public-html / 2015Feb / 0000.html public-htmlメーリングリストでこの投稿への返信を希望するすべての人をお勧めします。
マークE.ハーセ

12

GETとPOSTには、明確なコンテンツ中立的な根拠があります。GETは、URLのコンテンツを、安全に繰り返しキャッシュできる方法で取得することです。POSTは、繰り返し、投機的に実行、またはキャッシュするのが安全でない方法で何かをすることです。

PUTまたはDELETEに類似した根拠はありませんでした。両方ともPOSTで完全にカバーされています。リソースの作成または破棄は、繰り返し実行するのが安全ではなく、投機的に実行するのが安全ではない操作であり、キャッシュしないでください。追加の特別なセマンティクスは必要ありません。

したがって、基本的に利点はありません。


22
POSTはPUTとDELETEを対象としていますが、別々のメソッドを使用することの利点を引き続き確認できます。それらはすべてHTTP仕様でカバーされており、それらの使用はRESTで推奨されています。
FilipK

10
@David:それは機能です
ドナルドフェローズ

15
理論的根拠は、POSTとDELETEの意味が異なる(ほぼ反対の)ことです。POSTがDELETEを完全にカバーしていると主張しますが、POSTはべき等ではなく、DELETEはそうです。それをどう説明しますか?w3.org/Protocols/rfc2616/rfc2616-sec9.html
Mark E. Haase

14
賢い例えですが、あなたは「カバー」の意味を再定義しています。元の答えでは、「同じユースケースをすべてサポートする」などの「カバー」を意味します。ここでは、「カバー」を再定義して、ある種の分類学的関係を意味しています。言語をカットしましょう。POSTは、べき等の違いにより、DELETEと同じユースケースをサポートしていません。GETは、セマンティクスが異なるため、DELETEと同じユースケースをサポートしていません。DELETEをサポートすると、ユーザーエージェントの機能が向上します。
マークE.ハーセ

13
この答えには同意しません。POST、dem等ではないため、ブラウザで「戻る」をクリックすると、フォームを再送信する必要があるというsaysいページが表示されます。ただし、があった場合PUTPUTリクエストを安全に再送信して、取得するページを表示できます。もちろん、1つを作成してAPIを台無しにしないでくださいDELETE /resource/latest
arg20 14

12

これは、バグ10671がフォームメソッドとしてPUTおよびDELETEのサポートを追加することを検討しているため、2010年に発生しました。

この「機能」といくらかの利き手については中程度のプッシュバックがありましたが、最終的にはワーキンググループバグトラッカーの2つの問題としてエスカレートされました。

ISSUE-196の問題により、HTML仕様では現在POSTリクエストへの応答の処理方法が制限されていないため、仕様に変更を加えないという合意に至りました。この特定の問題は、一般的に使用されているPOSTリダイレクトパターンと、ReSTfulサーバーがブラウザーでレンダリングするのに役立つものではなく、短いメッセージで2xx応答を提供する方法を調整しようとするときに発生したと考えられます。

ISSUE-195の問題が議長に提出されました。キャメロン・ジョーンズは、2012年1月18日にボランティアとして変更提案書を作成し、2014年5月29日に最初のワーキングドラフトとして提出しました。ドラフトはW3C勧告プロセスをます

運が良ければ、これはまもなくW3Cの推奨事項になり、ブラウザベンダーによって実装され、ブロッカーを削除して、統一されたセマンティックでブラウザフレンドリーなReSTfulサービスを作成するための大きな前進ステップになります。これは、サービスパターンの興味深い進化を引き起こすと思います。Jon Mooreによる良い講演があります-見る価値のあるハイパーメディアAPI、これは私の興味を引きましたが、最初のハードル(このハードル)で落ちました。


5

私の理解では、PUTまたはDELETEを送信するとブラウザーは何をすべきかわからないということです。通常、POSTは適切なページにリダイレクトしますが、PUTとDELETEは通常リダイレクトしません。これにより、Webブラウザーフォームからではなく、ajaxまたはネイティブプログラムを介した呼び出しに適しています。

私は今それを隠すことはできませんが、彼らがこれについて議論していたときにhtml5メーリングリストの1つを読んだことを覚えています。


4
PUTおよびDELETEがPOSTと同じ方法でリダイレクトできない、またはリダイレクトしない理由はありますか?
ライアンH

3
:@maxpolunこれはおそらく、あなたが参照しているメーリングリストですlists.w3.org/Archives/Public/public-html-wg-issue-tracking/...
jordanbtucker

2
@RyanHありません。削除リクエストを送信したすべてのアプリは、インデックスへのリダイレクトで返信します。
Qwertie

5

歴史

RFC1866(セクション8.1)でのhtmlフォームの最初の出現に言及する価値があると思います。ここで、メソッド属性は次のように定義されます。

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年11月)はHTTP 1.0(1996年5月)より前 に指定されたことに留意してください。したがって、誰もがGET(HTTP 0.9以降)または拡張機能POSTでのみHTTPを使用していました。ただし、PUTおよびDELETEをサポートしているWebサーバーはごくわずかです(HTTP 1.0付録に記載されているように)。

考え

Berners-LeeのセマンティックWebの開発がどのように進化したのかを考えると、実際の問題から一般的な概念に移行したことが明らかです。最初に彼はドキュメントを共有したかった。そのため、マークアップが必要でした。次に、データベースでコンテンツを照会したかったので、フォームが必要でした。それから彼は新しいデータをデータベースに入れたかった。そこで彼はGETとPOSTでフォームを使用しました。その後、彼はリモートからのデータに対してすべてのCRUD操作を実行できることに気付いた可能性があるため、HTTPが拡張されましたが、遅すぎたためHTMLは拡張されませんでした(新しいCRUD操作をサポートしたサーバーはわずかでした)。


-2

単なる推測を投げ捨てますが、おそらく、HTTPはアクセス制御が最高の状態でひどく良くないためであり、誰もが最後に必要とするのは、悪意のあるURLがセキュリティが不十分なWebサイトやアプリケーションを侵害するさらに多くの方法です。

HTTPは、サーバーからクライアントへのダウンロード以外のファイル転送に適したプロトコルではありません。FTPを使用します-またはそれ以上、SFTP。


12
セキュリティはこれとは無関係です。HTTP経由でPUT / Deleteリクエストを行うことができます。curl --request PUT http://A.B.c/index問題は、これらのコマンドにHTML経由でアクセスできる理由です。
マーティンヨーク

5
-1 SOでは通常、ワイルドな推測は役に立たない。
マークE.ハセ

-4

GetとPostは、リクエストのデータを送信する形式です。

私はあなたがRESTFULサービスにフォームを送信することについて尋ねていると思います。ただし、httpリクエストの標準を変更して、httpリクエストの目的を仮定することは意味がありません。要求が満たされる目的に関する情報は、入力フィールドで最適に処理されます。

アドレスとgetおよびpostがあれば、サーバーはリクエストとその入力値を正しく解釈できます。そこから入力値を使用すると、サーバーに対してオープンエンドのリクエストを行い、必要な処理を実行できます。たとえば、値が「put」および「delete」であるフィールドを持つことができます


5
-1「GetおよびPostは、リクエストのデータを送信する形式です。」いいえ、それらはHTTPメソッドであり、「フォーマット」ではありません。
マークE.ハーセ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.