どのHTTPメソッドがどのCRUDメソッドと一致しますか?


213

RESTfulスタイルのプログラミングでは、ビルディングブロックとしてHTTPメソッドを使用する必要があります。どのメソッドが従来のCRUDメソッドと一致するかについては、少し混乱しています。GET / ReadとDELETE / Deleteは明白です。

ただし、PUT / POSTの違いは何ですか?それらは、作成と更新と1対1で一致しますか?

回答:


298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUTは、PUTで​​使用されるURIの存在に応じて、作成と更新の両方にマップできます。

POSTはCreateにマップされます。

修正:POSTは、通常、作成に使用されますが、更新にマップすることもできます。POSTは部分的に更新することもできるため、提案されたPATCHメソッドは必要ありません。


16
+1:名前(URI)がクライアントによって割り当てられるリソースを作成するPUTと、サーバーによって名前が割り当てられるリソースを作成するPOSTの区別は重要です。それについての議論については、RichardsonとRubyのRestful Web Services(O'Reilly)を参照してください。
ジムフェラン2011年

9
また、PUTとDELETEはまだWebブラウザーでサポートされていないため、POSTされるURIにmethod = PUTやmethod = DELETEなどのクエリ文字列引数を追加して、「POSTをオーバーロード」しても問題ないと考えられます。
ジムフェラン2011年


13
@JimFerrans PUTおよびDELETEは、XHRを使用して、Webブラウザーで問題なくサポートされます。ただし、HTMLフォームのコンテキストでは、HTML仕様はそれらをサポートしていないため、ブラウザーもサポートできません。
eis 2013

3
CRUDの文字に正規にマッピングしていませんが、多くのRESTフレームワークはGET / entity /を使用して、エンティティタイプのエンティティリストします。GET / entity / idは、idに一致する特定のエンティティを読み取ります。
Toddius Zho 2013

49

重要なのは、べき等の変更を行っているかどうかです。つまり、メッセージに対して2回アクションを実行した結果、1回だけ実行されたかのように「同じ」ものが存在する場合は、べき等の変更があり、PUTにマップする必要があります。そうでない場合は、POSTにマップされます。クライアントがURLを合成することを決して許可しない場合、PUTはUpdateにかなり近く、POSTはCreateを適切に処理できますが、それが唯一の方法ではありません。クライアントが作成したいこと/foo/abcを知っていて、そこにどのコンテンツを配置するかを知っている場合、PUTとして正常に機能します。

POSTの標準的な説明は、何かを購入しようとしているときです。それは、知らないうちに繰り返したくないアクションです。対照的に、事前に注文の発送先住所を設定することは、PUTを使用して問題なく実行できます。1 6 Anywhere Dr, Nowhereville回、2回、または100回送付するように指示されても、それは同じ住所です。それはアップデートだということですか?かもしれない…それはすべてあなたがバックエンドをどのように書きたいかに依存します。(結果が同一でない可能性があることに注意してください:ユーザーがリソースの表現の一部として最後にPUTを行ったときにユーザーに報告することができます。これにより、繰り返されるPUTが同一の結果を引き起こさないことが保証されますが、結果は依然として機能的な意味で「同じ」であること。)


1
この区別のためのユースケースの間POSTPUT興味深いものである、との答えにする必要があります「『作成』とこれが『更新』であるのか?」はるかに明確です。さらに、APIの実装に関しては、繰り返しPUTはサイレントno-opになるPOSTはずですが、送信されるデータの一部の側面がデータストア内で一意のままであると想定される場合、繰り返しは例外をスローする可能性があります。それがアプリケーションを支えています。
zerobandwidth

2
この回答とそれに続くコメントは、CRUDをHTTP RESTセマンティクスと緊密に(1対1)で同等と見なす場合に注意払う必要があるという重要なポイントを提起します。これは正規のマッピングではありません。
Martin Spamer

35

私は同じ答えを探していましたが、IBMの言うとおりです。 IBMリンク

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.

10

現在(2016)の最新のHTTP動詞は、GET、POST、PATCH、PUT、DELETEです。

概観

  • HTTP GET-SELECT /リクエスト
  • HTTP PUT-更新
  • HTTP POST-挿入/作成
  • HTTPのPATCH - PUTあなたが部分的に列を更新する必要がある場合:ティンは完全なリソース表現は、例えば、面倒であり、より多くの帯域幅を利用して
  • HTTP DELETE-DELETE

お役に立てれば!

REST APIの設計に興味がある場合は、これを参考にしてください。ウェブサイトオンライン版 github リポジトリ


1
18年2月現在、PATCHはクライアントライブラリとサーバーライブラリに完全には実装されていないことに注意してください。
ディズリー2018

わかりました。ありがとうございます。リンク/リファレンスを投稿していただけませんか。
d1jhoni1b

9

実際にこれを説明するstormpathによる素晴らしいyoutubeビデオトークがあります、URLはビデオの正しい部分にスキップする必要があります:

ストームパスyoutubeビデオ

また、1時間以上話し合うのも一見の価値がありますが、REST APIの構築に時間を費やすことを考えている場合は非常に興味深いものです。


7

具体的な状況にもよりますが、一般的には:

PUT =リソースの具象URIで具象リソースを更新または変更します。

POST = 指定されたURIのソースの下に新しいリソースを作成します。

すなわち

ブログ投稿を編集します。

PUT:/ blog / entry / 1

新しいものを作成します。

POST:/ blog / entry

PUTは、新しいリソースのURIがリクエストの前に明確である状況で、新しいリソースを作成する場合があります。POSTを使用して、他のいくつかの使用例を実装することもできますが、他の使用例(GET、PUT、DELETE、HEAD、OPTIONS)ではカバーされていません。

CRUDシステムの一般的な理解は、GET =要求、POST =作成、Put =更新、DELETE =削除です。


4

RESTのビルディングブロックは、主にリソース(およびURI)とハイパーメディアです。このコンテキストで、GETはリソースの表現を取得する方法です(これは確かSELECTにCRUD用語でCRにマップできます)。

ただし、CRUD操作とHTTP動詞の間の1対1のマッピングを必ずしも期待する必要はありません。主な違いPUTとは、POSTその冪等財産についてです。リソースの完全に新しい表現を送信することを一般に意味するPOSTため、部分更新にも一般的に使用されますPUT

私はこれを読むことをお勧めします:

HTTP仕様はまた、有用基準です。

PUTメソッドは、囲まれたエンティティが指定されたRequest-URIの下に格納されることを要求します。

[...]

POST要求とPUT要求の基本的な違いは、Request-URIの異なる意味に反映されています。POSTリクエストのURIは、囲まれたエンティティを処理するリソースを識別します。そのリソースは、データを受け入れるプロセス、他のプロトコルへのゲートウェイ、または注釈を受け入れる個別のエンティティの場合があります。対照的に、PUTリクエストのURIは、リクエストに含まれるエンティティを識別します。ユーザーエージェントは、意図するURIを認識しており、サーバーはリクエストを他のリソースに適用してはいけません。サーバーがリクエストを別のURIに適用したい場合は、


3

一般的に言えば、これは私が使用するパターンです:

  • HTTP GET-SELECT /リクエスト
  • HTTP PUT-更新
  • HTTP POST-挿入/作成
  • HTTP DELETE-DELETE

5
PUTとPOSTは、UpdateまたはCreateのいずれにも完全には一致しません。PUTは「設定」されています(つまり、事前にリソース名がわかっていて、使用する値を提供している場合)。POSTはそれ以外のすべてです。重要なのは、あなたがやっていることがべき等であるかどうかを考えることです。
ドナルフェロー2011年

1
コメントに+1します。2つの間の絶対マッピングの仮定は誤解を招く可能性があります。たとえば、一部のURIに対するHTTP DELETE操作では、サーバー側のレコードを単に変更(つまり、UPDATE)するだけで、HTTP GET操作に対する表現が返されなくなります。
立つ

4
PUTとPOSTは、UpdateまたはCreateのいずれにも完全には一致しません。本当ですが、AJは彼が使用するパターン説明しました。
Piotr Dobrogost

1

Symfonyプロジェクトは、CRUDメソッドをアップ参加してHTTPメソッドを維持しようとすると、そのリストにそれらが次のように仲間:

  • GETサーバーからリソースを取得します
  • POSTサーバー上にリソースを作成します
  • PUTサーバー上のリソースを更新します
  • DELETEサーバーからリソースを削除します

彼らがそのページで言っているように、「実際には、多くの最近のブラウザはPUTおよびDELETEメソッドをサポートしていません」ことに注意する価値があります。

私が覚えていることから、Symfonyはフォームを生成するときにそれらをサポートしないブラウザーのPUTとDELETEを偽装し、ブラウザーがサポートしていない場合でも理論的に正しいHTTPメソッドの使用にできるだけ近づけようとしますそれ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.