web-dev-qa-db-ja.com

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

RESTfulサービスをデバッグする方法 のように、ここにいくつか質問があります。

残念ながら、同じブラウザでHTTP PUT、DELETE、そしてある程度HTTP POSTさえテストできません。

私はまた、ブラウザはGETとPOSTのみをサポートしていると聞いた。

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

589
John Millikin

いいえ。 HTML 5の仕様 には次のように記載されています。

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

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

POST(---)というキーワードpost。HTTPPOSTメソッドを示します。 POSTメソッドは、送信されたフォームのデータの処理をサーバーに許可するように要求します。これにより、アイテムがデータベースに追加され、新しいWebページリソースが作成され、既存ページが更新されます。または上記のすべての結果。

状態ダイアログにマッピングするキーワードdialog。フォームを送信すると、フォームが見つかった場合にダイアログボックスを閉じ、それ以外の場合は送信しないことを示します。

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

すなわちHTMLフォームはHTTPリクエストメソッドとしてGETPOSTのみをサポートします。これを回避するには、サーバーによって読み取られる隠しフォームフィールドを使用してPOSTを介して他のメソッドをトンネリングし、それに応じて要求をディスパッチします。

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

456
Matthew Murdoch

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

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

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

77
Anne

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

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

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

付記として IE 7–8は次のHTTPメソッドだけを許可します: "GET"、 "POST"、 "HEAD"、 "PUT"、 "DELETE"、 "MOVE"、 "PROPFIND"、 "PROPPATCH" 、 "MKCOL"、 "COPY"、 "LOCK"、 "UNLOCK"、および "OPTIONS"

41
Vihung

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

Railsで使われており、どんなフレームワークにも適応できます。

  • gETまたはPOST以外のフォームに隠し_methodパラメータを追加します。

    <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

私はそれらのコメントが特にXMLHttpRequestname__ではなくブラウザを参照する、すなわちリンクをクリックしてフォームを送信することを信じると思います。 XMLHttpRequestname__は、ブラウザをランタイムとして使用するyouが記述したカスタムクライアントです。

更新:明確にするために、(=書いたとしても)youXMLHttpRequestname__を書いたことを意味するのではありません。私はあなたがXMLHttpRequestname__を使うコードを書いたことを意味しました。ブラウザはXMLHttpRequestname__をネイティブにサポートしていません。 XMLHttpRequestname__はJavaScriptランタイムに由来し、ブラウザによってホストされることがありますが、必須ではありません( Rhino を参照)。ブラウザがPUTname__とDELETEname__をサポートしていないと人々が言うのはそのためです。実際にJavaScriptがそれらをサポートしているからです。

15
Hank Gay

YES、PUT、DELETE、HEADなどHTTPメソッドはすべての最近のブラウザで利用できます。

XMLHttpRequest Level 2 ブラウザに準拠するには、これらのメソッドをサポートしている必要があります。どのブラウザがXMLHttpRequest Level 2をサポートしているかを確認するには、CanIUseをお勧めします。

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

Opera Miniだけがatm(juli '15)をサポートしていませんが、Opera Miniはすべてをサポートしていません。 :)

8
Stijn de Witt

ちなみに、Safari 2以前はPUTとDELETEをサポートしていませんでした。私は3の印象を受けますが、もうテストするためにそれを持っていません。 Safari 4は間違いなくPUTとDELETEをサポートしています。

7
jharlap