質問
HTTP GET、PUT、DELETE、POST、HEADを使用する実際的な利点は何ですか?行動上の利点(安全性とべき等性)に焦点を合わせ、名前を忘れて、必要な行動に応じてGET、PUTまたはPOSTを使用しませんか?
GET、PUT、POSTのみを使用する(およびHEAD、DELETEをドロップする)のはなぜですか?
解決
[REST] [1]アプローチでは、POST、GET、PUT、およびDELETEを使用して、WebリソースのCRUDルールを実装します。これは、オブジェクトをWeb上のリクエストに公開するためのシンプルで整然とした方法です。オーバーヘッドのないWebサービスです。
意味の違いを明確にするだけです。各操作はかなり異なります。ポイントは、明確で明確な意味を持つ素敵なHTTPメソッドを持つことです。
POSTは新しいオブジェクトを作成します。 URIにはキーがありません。オブジェクトを定義するメッセージ本文を受け入れます。 SQL挿入。 [編集 POSTにキーがないという技術的な理由はありませんが、RESTの人々は、POSTがCREATEとして明確な意味を持つにはキーを持たないことを強くお勧めします。]
GETは、既存のオブジェクトを取得します。 URIには キーがあり、シングルトンGETを実行しているかリストGETを実行しているかによって異なります。 SQL Select
PUTは既存のオブジェクトを更新します。 URIにはキーがあります。オブジェクトを更新するメッセージ本文を受け入れます。 SQLアップデート。
DELETEは、既存のオブジェクトを削除します。 URIにはキーがあります。 SQL削除。
PUTではなくPOSTでレコードを更新できますか?あいまいさを導入せずに。動詞には明確な効果があるはずです。さらに、POST URIにはキーがありません。PUTにはキーが必要です。
POSTを実行すると、201が作成されます。それが得られない場合、何かが間違っています。同様に、PUTを実行すると、200 OKが期待されます。それが得られない場合、何かが間違っています。
POSTがPOSTまたはPUTを実行するという曖昧さを主張できると思います。 URIは異なっている必要があります。また、関連するメッセージが異なる場合があります。一般的に、RESTの人々は、INSERTとUPDATEが異なる動詞であるSQLからヒントを得ています。
レコードが存在しない場合はUPDATEを挿入し、レコードが存在する場合は更新するというケースを作成できます。ただし、UPDATEがUPDATEを意味し、更新の失敗が何らかの問題を意味する場合は、より簡単です。 INSERTへの秘密のフォールバックにより、操作があいまいになります。
RESTfulインターフェースを構築していない場合、取得と作成/更新にはGETとPOSTのみを使用するのが一般的です。ユーザーがフォームの送信をクリックしたときに、POSTとPUTを区別するために、URIの違いまたはメッセージの内容の違いがあるのが一般的です。ただし、POST = createケースかPOST = updateケースかをコードで判断する必要があるため、あまりきれいではありません。
他のヒント
POST 安全性またはべき等性。これが、 PUT および DELETE — PUTとDELETEの両方がdem等である理由の1つです(つまり、1 + N個の同一のリクエストは1つのリクエストと同じ結果になります)。
PUT 指定されたURIのリソースの状態を設定するために使用されます。特定のURIのリソースに POST リクエストを送信する場合、そのリソースは に置き換えられるべきではありませんコンテンツ。最大で、追加する必要があります。これが、POSTがべき等ではない理由です。POSTSを追加する場合、すべてのリクエストがリソースに追加されます(たとえば、毎回ディスカッションフォーラムに new メッセージを投稿します)。
DELETE 指定されたURIのリソースがサーバーから削除されることを確認するために使用されます。 POST は通常、削除リクエストを送信する場合を除き、削除には使用しないでください。この場合も、POSTするリソースのURIは、削除するリソースのURIであってはなりません。 POSTするリソースは、POSTされたデータを受け入れて、それ自体に追加する、コレクションに追加する、または他の方法で処理するリソースです。
HEAD GETリクエストのヘッダーのみで、実際のコンテンツの帯域幅を無駄にしたくない場合に使用します。これは便利です。
なぜPOST以外のものが必要なのですか?データを両方向に流すことができるのに、なぜGETが必要なのでしょうか?答えは基本的にあなたの質問と同じです。さまざまな方法の基本的な期待を標準化することにより、他のプロセスは何をすべきかをよりよく知ることができます。
たとえば、介在するキャッシュプロキシが正しいことを行う可能性が高くなります。
たとえば、HEADについて考えてください。プロキシサーバーがHEADの意味を認識している場合、前のGETリクエストの結果を処理して、HEADリクエストに適切な回答を提供できます。そして、POST、PUT、およびDELETEがキャッシュされるべきではないことを知ることができます。
探している答えを誰も投稿していないので、自分でポイントをまとめてみます。
" RESTful Webサービス"第8章のセクション「POSTのオーバーロード」読み取り:" PUTとDELETEを完全に使用しない場合、GETを介してリソースに対する安全な操作、およびオーバーロードされたPOSTを介する他のすべての操作を公開することは完全にRESTfulです。これを行うと、リソース指向アーキテクチャに違反しますが、RESTの制限の少ないルールに準拠しています。"
要するに、 PUT / DELETEをPOSTに置き換えると、APIが読みにくくなり、PUT / DELETE呼び出しがdem等でなくなります。
一言で言えば:
idempotency
さらにいくつかの言葉で:
GET =安全+べき等性
PUT =べき等
DELETE =べき等
POST =安全でもべき等でもない
「べき等」とは、繰り返し実行できることを意味し、常にまったく同じことを行います。
PUT(更新)またはDELETEリクエストは何度でも再発行でき、毎回同じ効果がありますが、望ましい効果はリソースを変更するため、「安全」とは見なされません。
POSTリクエストは、リクエストごとに新しいリソースを作成する必要があります。つまり、効果は毎回異なります。したがって、POSTは安全またはべき等とは見なされません。
GETやHEADなどのメソッドは単なる読み取り操作であるため、dem等と同様に「安全」と見なされます。
これは、HTTPトランザクションを解釈する標準/一貫した方法を提供するため、実際には非常に重要な概念です。これは、セキュリティコンテキストで特に役立ちます。
すべてのホスティング事業者がPUT、DELETEをサポートしているわけではありません。
この質問をしたのですが、理想的な世界ではすべての動詞がありますが...:
HEADは、特定のサーバーのクロックが何に設定されているかを判断するのに非常に役立ちます(1秒以内またはネットワーク往復時間のいずれか大きい方に正確)。スラッシュドットからフューチュラマの引用を取得するのにも最適です:
~$ curl -I slashdot.org HTTP/1.1 200 OK Date: Wed, 29 Oct 2008 05:35:13 GMT Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4 SLASH_LOG_DATA: shtml X-Powered-By: Slash 2.005001227 X-Fry: That's a chick show. I prefer programs of the genre: World's Blankiest Blank. Cache-Control: private Pragma: private Connection: close Content-Type: text/html; charset=iso-8859-1
cURL の場合、 -I
はHEADリクエストを実行するためのオプションです。特定のサーバーの現在の日付と時刻を取得するには、単に
curl -I $ server | grep ^ Date
単純なREST APIのより良い/簡単な再利用を可能にする曖昧さを制限します。
GETとPOSTのみを使用できますが、PUTとDELETEがもたらす正確さと明瞭さの一部を失うことになります。 POSTは、何を意味するワイルドカード操作です。 PUTおよびDELETEの動作は非常に明確に定義されています。 リソース管理APIについて考える場合、GET、PUT、およびDELETEはおそらく、必要な機能の80%〜90%をカバーします。 GETとPOSTに制限する場合、APIの40%〜60%に、不適切に指定されたPOSTを使用してアクセスします。
GETおよびPOSTを使用するWebアプリケーションでは、ユーザーはデータを作成、表示、変更、および削除できますが、これらの目的で最初に作成されたHTTPコマンドの上のレイヤーで実行できます。 RESTの背後にあるアイデアの1つは、Webの設計の元の意図に戻ることです。これにより、各CRUD動詞に特定のHTTP操作があります。
また、HEADコマンドを使用して(潜在的に大きい)ファイルダウンロードのユーザーエクスペリエンスを向上させることができます。 HEADを呼び出して応答の大きさを確認し、GETを呼び出して実際にコンテンツを取得します。
具体的な例については、次のリンクをご覧ください。また、OPTIONS httpメソッドを使用する1つの方法も提案していますが、これについてはまだ説明していません。
追加機能を必要とするWebDAVのようなhttp拡張機能があります。
初期のWebサーバー戦争が原因である可能性があります。
1996年に記述されたHTTP 1.0では、GET、HEAD、POSTのみがありました。しかし、付録D を見るとわかるように、ベンダーは自分のもの。そのため、HTTPの互換性を維持するために、 1999年のHTTP 1.1 を作成する必要がありました。 。
ただし、HTTP / 1.0では十分に考慮されていません 階層プロキシの影響、キャッシング、必要性 永続的な接続、または仮想ホスト。さらに、増殖 自分自身を呼び出す不完全に実装されたアプリケーションの " HTTP / 1.0"プロトコルバージョンの変更を必要としました 相互の真の機能を判断する2つの通信アプリケーション。
この仕様は、「HTTP / 1.1」と呼ばれるプロトコルを定義しています。このプロトコルには、HTTP / 1.0よりも厳しい要件が含まれています その機能の確実な実装を保証します。
GET、PUT、DELETE、およびPOSTは、2年生がWebページを少数の誠実な原則に縮小できると考えた時代からの持ち越しです。
最近では、ほとんどのWebページは複合エンティティであり、これらのプリミティブ操作の一部またはすべてが含まれています。たとえば、ページには顧客情報を表示または更新するためのフォームがあり、これはおそらくいくつかのテーブルにまたがっています。
私は通常phpで$ _REQUEST []を使用しますが、情報の到着方法はあまり気にしません。基になる(複数の)パラダイムではなく、効率に基づいてGETまたはPUTメソッドを使用することを選択します。