更新および削除のHTTPステータスコード?


1374

UPDATEPUT)およびDELETE(たとえば、製品が正常に更新された)にはどのステータスコードを設定する必要がありますか?

回答:


2102

以下のためのPUT要求:HTTP 200またはHTTP 204を意味するものでなければならない「リソースが正常に更新します」。

以下のためにDELETEリクエスト:HTTP 200またはHTTP 204「リソースが正常に削除」を意味するものでなければなりません。HTTP 202を返すこともできます。これは、命令がサーバーによって受け入れられ、「リソースに削除のマークが付けられた」ことを意味します。

プット

既存のリソースが変更された場合、200(OK)または204(No Content)応答コード>を送信して、リクエストが正常に完了したことを示す必要があります。

削除

成功した応答は、応答にステータスを説明するエンティティが含まれている場合は200(OK)、アクションがまだ実行されていない場合は202(承認済み)、アクションが実行されているが応答に含まれていない場合は204(コンテンツなし)であるべきです(SHOULD)。エンティティ。

出典:W3.org:HTTP / 1.1メソッド定義

HTTP 200 OK:成功したHTTPリクエストに対する標準応答。実際の応答は、使用される要求メソッドによって異なります。

HTTP 204 No Content:サーバーはリクエストを正常に処理しましたが、コンテンツを返していません

ソース:HTTPステータスコードのリスト:2xx成功


40
とても便利な投稿!しかし、クライアントから送信されたリクエストが有効であり(DELETE mySite / entity / 123)、削除するエンティティが存在しないため、HTTPステータスコードはどうなるのかと思います。
マーティン

64
@Martin:その場合、サービスはHTTP 404を返す必要があります。厳密に言えば、存在しないリソースに対するDELETEまたはGETリクエストは「有効な」リクエストではありません。クライアントはその要求が成功しないので再試行しないでください... HTTPプロトコルは2つのカテゴリの問題を定義します-クライアントが要求を再試行する前に要求を変更する必要がある4xxステータスコードの問題と5xxステータスの問題コードは、サービスに問題が発生したことを示し、クライアントは変更せずにまったく同じ要求を再試行する必要があるか、または再試行できることを示します。
Daniel Vassallo、2011

17
@JeffMartinすなわち、ユーザの観点からはそうかもしれないが、リソースが存在しない場合、遠くのサーバが関係する限り、サーバは404を返すべきである
Randolpho

17
@Randolpho、べき等は、操作を1回または複数回呼び出しても、同じ結果を得ることです。クライアントは、リソースが削除されていることを確認するように求めています。404を返すメリットは何ですか?なぜどちらの方法を知る必要があるのですか?クライアントロジックは、1つではなく2つの個別の応答コードを処理する必要があります。
ギリ2013年

26
@Gili:おそらくwikiがより適切に説明します:メソッドPUTおよびDELETE
Randolpho

858

短い答え:PUTとDELETEの両方で、200(OK)または204(コンテンツなし)を送信する必要があります。

長い答え:これは完全な決定図です(クリックして拡大)。

HTTP 1.1決定図

ソース:https : //github.com/for-GET/http-decision-diagram


37
図は素晴らしいです。印刷用の高解像度バージョンはありますか?
KiKi

1
既存のリソースのPOSTのコンテキストでは、別のSOディスカッション(stackoverflow.com/questions/3825990/…)は、コンテンツを追加する代わりに409 Conflictまたは302 Foundを送信することを提案しています。
koppor 2013年

7
削除が発生した後の204と200の応答を元に戻す必要があるかどうか知りたいのですが、それらが正しいのはなぜですか?削除しましたか?->応答にエンティティが含まれていますか?->はい-> 204コンテンツなし。いいえ-> 200 OK
マット

62
イメージの更新バージョンはこちらです:raw.github.com/for-GET/http-decision-diagram/master/httpdd.png
zaius

19
PATCHがありません。
ドレミ

151

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

削除

  • 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エラーが発生した場合です。

7
この答えは、ほぼ完全に2つの大きな引用で構成されていますが、帰属はありません。どこから引用していますか?
クエンティン

状態が効果的に変更されない場合、204はPUTリクエストに対して返される適切なステータスですか?たとえば、ユーザーを非アクティブ化するように依頼しましたが、ユーザーはすでに非アクティブです。
ΕГИІИО

PUTリクエストはべき等なので、システムでオブジェクトが変更されたため、204を返すことができます。PUTはPATCHではないので、どのフィールドを変更するのかわからない。オブジェクトがリクエスト内のオブジェクトと正確に同じであるかどうかをデザインが知る必要がある場合、501-502を送り返すことができますが、私はそれがあまり好きではありません。さらにフィールドを変更せずにユーザーを非アクティブ化します。おそらく、PATCHを使用できます。
Alfonso Tienda 2018年

1
HTTP 422 Unprocessable Entityを追加します。「不正なリクエスト」(不正なXML / JSONなど)と無効なフィールド値を区別するのに役立ちます。
vdboor


10

200および204に加えて、205(Reset Content)は有効な応答である可能性があります。

サーバーは要求を満たし、ユーザーエージェントは要求を送信する原因となったドキュメントビューをリセットする必要があります... [例]入力が与えられたフォームのクリア。


6

質問では、DELETEが200204のどちらを返す必要があるかを詳しく説明しているため、リンク付きのエンティティを返すように推奨する人もいるので、プリファレンスは200に設定することを検討してください。

「204(コンテンツなし)を返す代わりに、APIは役立つはずであり、行くべき場所を提案します。この例では、提供すべき明らかなリンクの1つは、「somewhere.com/container/」(マイナス「リソース」)へのリンクです」-クライアントがリソースを削除したコンテナ。おそらくクライアントはさらにリソースを削除したいので、それが役立つリンクになります。」

http://blog.ploeh.dk/2013/04/30/rest-lesson-learned-avoid-204-responses/

クライアントが204応答を検出した場合、クライアントはあきらめるか、APIのエントリポイントに移動するか、以前にアクセスしたリソースに戻ることができます。どちらのオプションも特に良いものではありません。

個人的には、204が間違っているとは言いません(著者もそうではありません。彼は "迷惑"と言っています)。クライアント側での適切なキャッシュには多くの利点があるからです。どちらの方法でも一貫性を保つことが最善です。


6

ここにいくつかのステータスコードがあります。これは、知識として知っておく必要があります。

1XX情報応答

  • 100 続行
  • 101 スイッチングプロトコル
  • 102 処理
  • 103 初期のヒント

2XX成功

  • 200 OK
  • 201 作成されました
  • 202 受け入れ
  • 203信頼でき ない情報
  • 204 コンテンツなし
  • 205 コンテンツをリセット
  • 206 部分的なコンテンツ
  • 207 マルチステータス
  • 208 報告済み
  • 226 IM使用

3XXリダイレクト

  • 300 複数の選択肢
  • 301 永久に移動
  • 302 見つかりました
  • 303 他を見る
  • 304 変更されていません
  • 305 プロキシを使用
  • 306 スイッチプロキシ
  • 307 一時的なリダイレクト
  • 308 永久リダイレクト

4XXクライアントエラー

  • 400 不正なリクエスト
  • 401 無許可
  • 402 支払いが必要
  • 403 Forbidden
  • 404 が見つかりません
  • 405 メソッドは許可されていません
  • 406 受け入れ不可
  • 407 プロキシ認証が必要です
  • 408 リクエストのタイムアウト
  • 409 紛争
  • 410 なくなった
  • 411 必要な長さ
  • 412 前提条件が失敗しました
  • 413 ペイロードが大きすぎます
  • 414 URIが長すぎます
  • 415 サポートされていないメディアタイプ
  • 416 範囲が満足できません
  • 417 予想に失敗しました
  • 418 ティーポットです
  • 420 メソッドの失敗
  • 421 誤ったリクエスト
  • 422 処理できないエンティティ
  • 423 ロック済み
  • 424 失敗した依存関係
  • 426 アップグレードが必要
  • 428 前提条件が必要です
  • 429 リクエストが多すぎます
  • 431 リクエストヘッダーフィールドが大きすぎます
  • 451 法的な理由で利用不可

5XXサーバーエラー

  • 500 内部サーバーエラー
  • 501 実装されていません
  • 502 Bad Gateway
  • 503 サービスを利用できません
  • 504 ゲートウェイタイムアウト
  • 505 Httpバージョンはサポートされていません
  • 506 Varientまた交渉します
  • 507 ストレージ不足
  • 508 ループが検出されました
  • 510 拡張されていません
  • 511 ネットワーク認証が必要です


-1

リソースが変更されると、応答コードは200(「OK」)になります。リソースのURIを変更するようにリソースの状態が変化した場合(たとえば、ユーザーアカウントの名前が変更された場合)、応答コードは301(「永久に移動」)になり、Locationヘッダーに新しいURIが提供されます。

オブジェクトが削除されると、応答コードは200(「OK」)になります。

詳細については、以下のリンクに従ってください- 残りのステータスコード

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