7

REST で特定の動詞を使用する必要がある場合とその理由について混乱します。

次のような基本的なことを知っています。

Get -> for retrieval
Post -> adding new entity
PUT -> updating
Delete -> for deleting

これらの属性は、上で書いた操作に従って使用されることになっていますが、その理由がわかりません。REST の Get メソッド内で新しいエンティティを追加するか、POST 内でエンティティを更新するとどうなりますか? または、エンティティを追加する DELETE 内にある可能性があります。これは初心者の質問かもしれませんが、理解する必要があります。私には非常に紛らわしいように聞こえます。

4

4 に答える 4

10

@archilには、動詞の誤用の落とし穴についての優れた説明がありますが、ルールはあなたが説明したものほど厳密ではないことを指摘しておきます(少なくともプロトコルに関する限り)。

  • GETは安全でなければなりません。つまり、GETリクエストは、実質的な方法でサーバーの状態を変更してはなりません。(サーバーは、要求のログ記録などの追加の作業を実行できますが、データは更新されません。)
  • PUTとDELETEはべき等でなければなりません。つまり、同じURIへの複数の呼び出しは、1つの呼び出しと同じ効果があります。たとえば、人の名前を「Jon」から「Jack」に変更し、PUTリクエストでそれを行う場合、1回または100回行うことができ、その人の名前はまだ更新されているため、問題ありません。 「ジャック」に。
  • POSTは、安全性またはべき等性について保証しません。つまり、POSTリクエストで技術的にやりたいことが何でもできるということです。ただし、クライアントがこれらの仮定を利用できるという利点は失われます。たとえば、POSTを使用して検索を実行できます。これは、意味的にはGET要求に近いものです。問題はありませんが、ブラウザ(またはプロキシやその他のエージェント)は、リクエストの結果として何も変更されていないと想定できないため、その検索結果をキャッシュすることはありません。さらに、Webクローラーは、操作が安全であると想定できなかったため、POSTリクエストを実行しませんでした。

ワールドワイドウェブのHTMLバージョン全体は、PUTまたはDELETEがなくても非常にうまく機能し、POSTを使用して削除または更新を行うことはまったく問題ありませんが、更新および削除(およびその他のべき等操作)に対してPUTおよびDELETEをサポートできる場合は、エージェントは操作がべき等であると想定できるため、少し良くなります。

安全性とべき等性に関する真の要点については、公式のW3Cドキュメントを参照してください。

于 2011-08-01T19:29:09.710 に答える
4

プロトコルはプロトコルです。それに関連するすべてのルールを定義することを意図しています。Httpもプロトコルです。上記のすべての規則 (http 動詞規則を含む) は http プロトコルによって定義され、使用法は http プロトコルによって定義されます。これらのルールに従わない場合、サービス内で何が起こるかを理解できるのはあなただけです。プロトコルの規則に従わず、他のユーザーにとって混乱を招く可能性があります。ある時有名な写真サイト(どちらでも構いません)でGETリクエストで写真を削除した例がありました。そのサイトのユーザーが Google デスクトップ検索プログラムをインストールすると、ページがローカルにアーカイブされます。そのプログラムは、GET 操作はデータを取得するためだけに使用され、何にも影響を与えるべきではないことを知っていたため、利用可能なすべての URL (GET 削除 URL を含む) に対して GET 要求を行いました。ユーザーがログインし、Cookie がブラウザにあったため、認証の問題はありませんでした。その結果、http プロトコルと GET 動詞の不適切な使用により、すべてのユーザーの写真がサーバー上で削除されました。そのため、使用しているプロトコルの規則に常に従う必要があります。技術的には可能ですが、定義されたルールを上書きすることは正しくありません。

于 2011-08-01T08:42:59.367 に答える
2

GET を使用してリソースを削除することは、内部で配列から何かを削除する配列に何かを追加するために名前が付けられ、文書化されている関数を持つようなものです。REST には、明確に定義されたいくつかのメソッド (HTTP 動詞) しかありません。サービスのユーザーは、サービスがこれらの定義に固執することを期待します。そうでない場合、サービスは RESTful Web サービスではありません。

于 2011-08-01T10:16:23.877 に答える
1

その場合、インターフェースが RESTful であると主張することはできません。REST の原則では、指定された動詞があなたが言及したアクションを実行することが義務付けられています。そうでない場合、RESTful インターフェイスとは言えません。

于 2011-08-01T08:16:04.623 に答える