規則によってどのREST PUT / POST / DELETE呼び出しが返すべきですか?


153
  1. 「RESTイデオロギー」によると、PUT / POST / DELETEリクエストのレスポンス本文には何を含める必要がありますか?

  2. 戻りコードはどうですか?でHTTP_OK十分?

  3. そのような慣習がある場合、その理由は何ですか?

私は、POST / PUTの違いを説明良い記事を見つけた:POST PUT対 しかし、それはまだ私の質問に答えていません。

回答:


130

余裕を許しますが、REST over HTTPを実行している場合、RFC7231は、GET、PUT、POST、およびDELETEから予想される動作を正確に記述します。

更新(2014年7月3日):
HTTP仕様では、POSTまたはDELETEから返されるものを意図的に定義していません。仕様は、何を定義する必要があるかを定義するだけです。残りは選択する実装者に任されています。


9
@tuxslayer私がただ卑劣なことをしようとしていたとは思わなかったのでよかったです。多くの人々は、RESTがHTTPメソッドに加えて追加の要件を追加すると考えているようです。ただし、そうではありません。追加の制約がありますが、HTTPメソッドの動作には実際には影響しません。RFC2616は間違いなく従うべきガイドです。
Darrel Miller

4
リンクありがとうございます。:)それは私を止めて、私が使っているツールについて考えさせました。あなたの投稿とRFCを読んだ後、私はその夜、RFCを参照していることに気づきました。プロセスを最初にHTTPプロセス、次に残りのプロセスと考えるのに役立ちます。とても有難い。
Perry Tew、2012

4
@PerryTewこれで、tools.ietf.org / wg / httpbisにアクセスして、HTTP仕様の現在改訂中のバージョンを確認できます。楽しい!
Darrel Miller

12
たぶんもっと睡眠が必要なだけかもしれませんが、RFC内でOPが要求した正確な情報を見つけることができないようです。POSTまたはDELETE応答の本文は何ですか?
Cam Jackson 14

9
まあ、それは泥と同じくらい明確です。おそらく、答えに含まれるいくつかの詳細情報が役立つでしょう。特に、そのリンクが停止している場合。
Doug Molineux 2014

25

全体として、この規則は「Webページを配信しているようなものだ」と考えています。

PUTの場合、直後にGETを実行した場合と同じビューが返されます。その結果、200になります(もちろん、レンダリングが成功した場合)。POSTの場合、作成されたリソースにリダイレクトします(作成操作を実行していると想定します。そうでない場合は、結果を返します)。正常に作成されたコードは201です。これは実際には、300の範囲にないリダイレクトの唯一のHTTPコードです。

DELETEが何を返すかについて満足したことはありません(このコードでは、現在のところ、HTTP 204と空の本文を生成しています)。


1
PUT結果のページにリフレッシュするので、次のページが悪い習慣のように思える要求リターンが再び実行するリクエストが発生します。代わりに、私にとっては、同期リクエストを処理していると想定して、リダイレクトを行うことは理にかなっています。
ロバティ2015年

1
@lobati複数の同一のPUTリクエストを送信すると、同じPUTリクエストの1つだけを送信した場合とまったく同じ結果になるはずです。おそらく、あなたが提起する問題は、上記のことを考えるとそれほど重要ではなくなりましたか?
Iain

3
@イアンはそうではない。問題は、何か他のものが後でレコードを更新する場合PUT、データを元に戻す別の要求を送信することを望まないことです。たとえば、2人が同じページを参照している場合、一方が更新を行い、次にもう一方が更新を行います。最初の人が更新して結果を確認すると、実際には、2番目の人が行う前の状態に戻ります。彼らの変化。
ロバティ2015

「ウェブサイトのように考える」は完璧です。したがって、削除は、リソースを削除する理由に関する「ストーリー」に応じて、いくつかの次のアクションで応答する可能性があります。これは少なくとも、エージェントをアクションの論理的な開始場所に戻すためのリンク、または削除(注文合計)の影響を示し、さらにリンクを含むステータスリソースにリダイレクトすることもできます。
ルークプレット

3

通常、リソースの作成はPOSTにマッピングされ、新しいリソースの場所が返されます。たとえば、Railsの足場では、CREATEは新しく作成されたリソースのSHOWにリダイレクトします。同じアプローチが更新(PUT)にも意味があるかもしれませんが、それは慣例ではありません。更新は成功のみを示す必要があります。削除はおそらく成功を示すだけで十分です。リダイレクトしたい場合は、リソースのリストを返すことがおそらく最も理にかなっています。

はい、HTTP_OKで成功を示すことができます。

上記で述べたことの唯一の厳格なルールは、CREATEは新しいリソースの場所を返す必要があるということです。それは私には簡単なことのようです。クライアントが新しいアイテムにアクセスできる必要があることは完全に理にかなっています。


2
実際には、PUTとPOSTを混同しています。POSTは作成に使用され、PUTは更新(および作成)に使用されます。PUTはべき等ではないのに対し、PUTはべき等であるべきであることに注意することも価値があります。
スティービー

べき等コマンドは、何度実行しても適切に機能するはずです。したがって、悪影響を与えることなく、同じ「更新」を適用するために同じPUTを複数回実行できるはずです。
Jacob Mattison

1

RFC7231によって、それは問題ではなく、空である可能性があります

プロジェクトにjson api標準ベースのソリューションを実装する方法:

post / put:getの場合と同様にオブジェクト属性を出力します(フィールドフィルター/関係も同じように適用されます)

削除:データにはnullのみが含まれます(欠落しているオブジェクトの表現のため)

標準削除のステータス:200


0

私はアルフォンソティエンダが好きです 更新と削除のHTTPステータスコードですか?

ここにいくつかのヒントがあります:

削除

  • 200(応答で追加のデータを送信する場合)または204(推奨)。

  • 202削除された操作はまだコミットされていません。

  • 削除するものが何もない場合は、204 または 404を使用します(DELETE操作はべき等であり、既に削除されたアイテムの削除は操作成功なので、204を返すことができますが、べき等は必ずしも同じ応答を意味するわけではありません)

その他のエラー:

  • 400 Bad Request(不正な構文または不正なクエリは奇妙ですが可能です)。
  • 401 不正認証の失敗
  • 403 Forbidden:承認エラーまたは無効なアプリケーションID。
  • 405 許可されない。承知しました。
  • 409 リソースの競合は、複雑なシステムで発生する可能性があります。
  • および501502エラーが発生した場合です。

置く

コレクションの要素を更新する場合

  • 上記のDELETEと同じ理由で200/204
  • 操作がまだコミットされていない場合は202

参照された要素は存在しません:

  • PUTは201にすることができます(これがあなたの振る舞いであるので要素を作成した場合)

  • 404 PUTを介して要素を作成したくない場合。

  • 400 Bad Request(不正な構文または不正なクエリがDELETEの場合よりも一般的)。

  • 401 無許可

  • 403 Forbidden:認証失敗または無効なアプリケーションID。

  • 405 許可されない。承知しました。

  • 409 リソースの競合は、DELETEなどの複雑なシステムで発生する可能性があります。

  • 422 Unprocessable entityこれは、「不正なリクエスト」(たとえば、不正なXML / JSON)と無効なフィールド値を区別するのに役立ちます

  • および501502エラーが発生した場合です。

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