PUT、DELETE、HEADなどのメソッドは、ほとんどのWebブラウザーで使用できますか?


608

私は、RESTfulサービスをデバッグする方法のように、ここでいくつかの質問を見てきました。

残念ながら、同じブラウザでは、HTTP PUT、DELETE、およびある程度はHTTP POSTをテストすることはできません。

ブラウザはGETとPOSTのみをサポートしていると聞いたことがあります。

ただし、Firefoxでのいくつかの簡単なテストでは、送信PUTDELETEリクエストが期待どおりに機能することが示されています-はXMLHttpRequest正常に完了し、リクエストは正しい方法でサーバーログに表示されます。ブラウザー間の互換性や明白でない制限など、これに欠けている側面はありますか?


1
心配する必要があるのはクライアントだけではなく、多くのサーバー側フレームワークはGETとPOSTのみをサポートしています。
ダービー

7
ジョン、RESTタグを使いたくない理由はありますか?
John Saunders

11
これを読んだ人はおそらくRESTful APIを調査しているでしょう。
djjeck


いいえ、すべてのブラウザがPUT / DELETEメソッドをサポートしているわけではなく、すべてのサーバー側のテクノロジーがPUT / DELETEをサポートしているわけでもありません。HTML 5でサポートされているブラウザーのみがPUT / DELETEをサポートしています。
ジャニデバン

回答:


463

いいえ。HTML5仕様では次のように述べています。

methodおよびformmethodコンテンツ属性は、次のキーワードと状態を持つ列挙型属性です。

キーワードGET HTTP GETメソッドを示す、状態GETへのマッピング、。GETメソッドは、データを要求および取得するだけで、他の効果はありません。

キーワードポスト HTTP POSTメソッドを示す状態POSTに、マッピング、。POSTメソッドは、サーバーが処理される送信済みフォームのデータを受け入れることを要求します。これにより、アイテムがデータベースに追加されたり、新しいWebページリソースが作成されたり、既存のページが更新されたり、前述のすべての結果が発生したりします。 。

状態ダイアログへのマッピングであるキーワードdialogは、フォームの送信が、フォームが存在する場合はそれ自体を見つけ、送信しないダイアログボックスを閉じることを意図していることを示します。

これらの属性のデフォルトの無効な値はGET状態です

つまり、HTMLフォームはHTTPリクエストメソッドとしてGETおよびPOSTのみをサポートします。これの回避策は、サーバーによって読み取られる非表示のフォームフィールドを使用してPOSTを介して他のメソッドをトンネルし、それに応じて要求をディスパッチすることです。

ただし、GETPOSTPUTDELETE 、すべての主要なWebブラウザ(IE、Firefox、Safari、Chrome、Opera)のXMLHttpRequest(つまりAJAX呼び出し)の実装でサポートされています。


170
いいえ、私は間違いなくHTMLを意味します(テキストからは明確ではないかもしれませんが、HTMLフォームの機能について話しています-編集します)
Matthew Murdoch

6
@Matthew:これは、IE6またはIE7を使用している場合、次のようになります:-<form .. method = "PUT"> ... </ form> PUTがHTML 4で有効でないため、機能しませんか?
Pure.Krome 2008年

6
@ Pure.Krome(14か月後のみ)いいえ、HTML 4.01仕様では<form method = "put">または<form method = "delete">を実行できません。IE8、Chrome3、またはFF3.5では、GETおよびPOSTのみがサポートされています。
Jarrett Meyer

23
@porneL @Alan HTML5がそれらを追加してから削除しました。現在、GETおよびPOSTのみが許可されています。goo.gl/8EuZk
Adam

13
@porneL HTML5はそれらを追加し、それらを削除しましたが、バグは再び開かれました。興味深いことに、まだドキュメントが残っているドキュメントをいくつか見ました。自宅で追跡したい場合のバグは次のとおりです。w3.org
Emil Lerch

79

HTMLフォームはGETおよびPOSTをサポートしています。(ある時点でHTML5はPUT / DELETEを追加しましたが、それらは削除されました。)

XMLHttpRequestはCHICKENを含むすべてのメソッドをサポートしますが、一部のメソッド名は大文字と小文字を区別せずに照合され(メソッドはHTTPごとに大文字と小文字が区別されます)、一部のメソッド名はセキュリティ上の理由(CONNECTなど)でまったくサポートされません。

ブラウザはXMLHttpRequestで指定されたルールにゆっくりと収束していますが、他のコメントが指摘しているように、まだいくつかの違いがあります。


5
最新のHTML5ドラフトでは、PUTおよびDELETEのサポートが廃止されているようです。dev.w3.org
Stefan Tilkov

3
それらを取り戻すためのドラフトが提案されました:amundsen.com/examples/put-delete-forms
Joost Baaij

26
チキン?鳥?CHECKINのことだと思います。それは面白い母音の入れ替えです。
JayC

52
いいえ、私は鶏肉を意味しました、それをあなたが好きなものにすることができることを説明します。母音の入れ替えがおかしいことに同意しました:-)
Anne

6
私がこのチキン
n0nag0n 16/16の

43

XMLHttpRequest JavaScriptオブジェクトモデルの標準オブジェクトです。

ウィキペディアによると、XMLHttpRequest最初はActiveXオブジェクトとしてInternet Explorer 5に登場しましたが、その後標準になり、1.0、Apple Safari 1.2、Opera 7.60-p1、およびIE 7.0以降、MozillaファミリのJavaScriptで使用するために含まれています。

open()メソッドオブジェクトに対する引数としてHTTPメソッドをとり- 、任意の有効なHTTPメソッド(リンクの項目番号5を参照)をとるように指定されている-を含むGETPOSTHEADPUTおよびDELETE、としてRFC 2616で指定されました

補足として、IE 7–8は次のHTTPメソッドのみを許可します:「GET」、「POST」、「HEAD」、「PUT」、「DELETE」、「MOVE」、「PROPFIND」、「PROPPATCH」、「MKCOL」 、「コピー」、「ロック」、「ロック解除」、および「オプション」


7
さらに読むためにいくつかのドキュメントを見たいと思っていましたが、私はあなたを信じていません。ウィキペディアのリンクは実際にはかなりいいです。ありがとう
naugtur

19

_method 隠しフィールドの回避策

Railsで使用され、任意のフレームワークに適合させることができます。

  • _methodGETまたはPOSTではないフォームに非表示パラメーターを追加します。

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

    これは、HTML作成ヘルパーメソッド(Railsなどform_tag)を介してフレームワークで自動的に実行できます。

  • 実際のフォームメソッドをPOST(<form method="post")に修正します

  • _methodサーバー上でプロセスを実行し、実際のP​​OSTの代わりにそのメソッドが送信されたかのように処理します

理論的根拠/それが不可能な理由の歴史:https : //softwareengineering.stackexchange.com/questions/114156/why-there-are-no-put-and-delete-methods-in-html-forms


Santilliさん、こんにちは。このソリューションを提供してから久しぶりです。私はWeb開発の初心者なので、質問があります。つまり、「サーバーで_methodを処理し、実際のP​​OSTの代わりにそのメソッドが送信された場合とまったく同じように処理する」というのは、PUT(またはDELETE)を含む非表示メソッドをビューに配置すると、実際にはPUTを意味するということです。 (またはDELETE)リクエストは正しいですか?はいの場合、最初にPOSTメソッドを使用し、次に非表示のPUTまたはDELETEを使用する理由。POSTとPUT(またはDELETE)の間の接続とは何ですか:)
Mirich '24

1
@MirichフォームはPOSTのみをサポートします。そのため、サーバーが知っている追加のデータを含むPOSTを送信します。ああ、私はこれをPUTのように扱う必要があります。
Ciro Santilli郝海东冠状病六四事件法轮功

注意と返信をありがとうCiroに感謝します。POSTは、実際のP​​OST、PUT、PATCH、DELETEを内部に保持する普遍的なものであり、POSTを最初に非表示なしで使用すると、役職。しかし、hidden(PUTまたはDELETE)でPOSTを使用する場合、POST内の子としてPOST内にあるPUTまたはDELETEを使用することをサーバーに通知します。:)
Mirich

1
@Mirichうん、あなたはアイデアを持っていると思います。
Ciro Santilli郝海东冠状病六四事件法轮功

申し訳ありませんが、Ciroは最後に申し訳ありません。フォームタグの先頭でPUTまたはDELETEを使用し、hiddenを使用しない方が良いので、PUTとDELETEがHTML5から削除されたのはなぜでしょうか。PUTとDELETEが削除された実際の理由を簡潔かつ明確に説明していただけますか。よろしくお願いします:)
Mirich

15

私はこれらのコメントがブラウザを具体的に参照していると思いますXMLHttpRequest。ブラウザをランタイムとして使用するJavaScriptで記述しXMLHttpRequestたカスタムクライアントです

更新:明確にするために、私はあなたが書いたこと(私は書いたものの)意味しませんでしたXMLHttpRequest。を使用するコードを記述したことを意味しますXMLHttpRequest。ブラウザはネイティブでサポートしていませんXMLHttpRequestXMLHttpRequest必須ではありませんが、ブラウザーでホストされている可能性があるJavaScriptランタイムから取得されます(Rhinoを参照)。それが人々がブラウザがサポートしていないと言う理由ですPUT、そしてDELETEそれはそれらをサポートしているのは実際にはJavaScript だからです。


XMLHttpRequestは、JavaScriptオブジェクトモデルの標準オブジェクトです。
Jacob Krall、

9
@Jacob真ですが、ブラウザが異なればJavaScriptエンジンも異なります。どちらがPUTをサポートしているかを知ることは依然として役に立ちます。
senfo

1
it's actually JavaScript that is supporting them。本当ではない。XMLHttpRequest「ホストオブジェクト」です。つまり、ホストからJavascriptコードに機能を公開するオブジェクトです。これはJS自体の一部ではありません。
Stijn de Witt 2015

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
PUTとDELETEのサポートを得たSafariのバージョンを誰かが確認できますか?
mjs 2009年

1
すべてのブラウザーが今PUT&DELETEをサポートしているかどうか、そしておおよそどのくらいの期間、これが利用可能であったかについて、誰でも詳しく説明できますか?「チキン」の例に注目すると、これは、どのメソッドが使用されているかを解釈するのはサーバー次第であり、JavaScriptがメソッドのタイプを制限しないということですか?
コーディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.