4

ユーザーを会社にバインドする RESTful API があるとします。

PUT http://example.com/users/john.smith

{
  "company": "http://example.com/companies/Nintendo"
}

しかし、参照された会社は存在しません (おそらく競合状態のため、おそらくユーザー エラーが原因です)。データベースは外部キーが既存の行を指す必要があるため、操作を正常に完了できません。適切な応答コードとその理由は何ですか?

4

3 に答える 3

2

4xxクライアントから提供された情報が問題の原因であるため、これは間違いなくエラーです。

セマンティックな性質の問題を扱っているため、 HTTP 1.1 の WebDAV422が最適な応答コードです。

422 Unprocessable Entity (WebDAV)

422 (Unprocessable Entity)ステータス コードは、サーバーがリクエスト エンティティのコンテンツ タイプを理解していることを意味します。したがって、415 (Unsupported Media Type)ステータス コードは不適切です。リクエスト エンティティの構文正しいため、400 (Bad Request)ステータス コードは不適切ですが、含まれている命令を処理できませんでした。たとえば、このエラー状態は、XML 要求本文に整形式 (つまり、構文的に正しい) が含まれているが、意味的に誤った XML 命令が含まれている場合に発生する可能性があります。

もちろん、クライアントを暗闇の中に放置しないでください。エラーが発生した理由を応答本文で必ず説明してください。


次に、他のコードではない理由についていくつかの議論を行います。

  • `400 Bad Request`: *構文が正しくないため、サーバーがリクエストを理解できませんでした。クライアントは、変更せずにリクエストを繰り返すべきではありません。* - 構文は問題ありません (リクエストは整形式です)。エラーはセマンティックです (会社が存在しません)。さらに、クライアントは別の時点で (会社を追加した後) **変更なしで**リクエストを繰り返すことができ、それが機能する可能性があります。だから、400ではない。

  • `403 Forbidden` *サーバーはリクエストを理解しましたが、それを拒否しています。承認は役に立たず、要求を繰り返すべきではありません*: これは通常、クライアントが認証されているが、要求されたリソースへのアクセス許可 (書き込み、読み取り、またはその他の要件) がない場合に発行されます。403でもありません。

  • `404 Not Found` *サーバーは Request-URI に一致するものを見つけられませんでした*: エラーはユーザーである **Request-URI** に関するものであることに注意してください。この応答は、会社ではなく **ユーザー** (URI 内のユーザー) が存在しない場合に送信する必要があります。
  • そして他の人:

  • `401 Unauthorized` *リクエストにはユーザー認証が必要です*: ここで議論する必要はありません。
  • `402 Payment Required` *このコードは将来の使用のために予約されています*: どちらもここにはありません。
  • `405 Method Not Allowed`: HTTP メソッド (`GET`、`PUT` など) に関するものではありません。
  • `406 Not Acceptable`: これは受け入れヘッダーに関係しています。
  • `407 Proxy Authentication Required`: プロキシ関連。
  • `408 Request Timeout`: 明らかに違います。
  • `409 Conflict`: *リソースの現在の状態と競合するため、リクエストを完了できませんでした。* 現在の (以前に保存された) リソース (ユーザーの会社) はサーバーで問題ありません。新しい会社は常に受け入れられます。新しい会社は常に現在の会社を上書きするため、新しい会社と現在の会社の間に競合はありません。
  • `410 Gone`: *要求されたリソースはサーバーで利用できなくなり、転送先アドレスも不明です。* これも関係ありません。
  • `411 Length Required`: `Content-Length`ヘッダについてです。
  • `412 Precondition Failed`: リクエスト ヘッダー フィールドについて。
  • `413 Request Entity Too Large`: エンティティのサイズとは関係ありません。
  • `414 Request-URI Too Long`: URI のサイズでもありません。
  • `415 Unsupported Media Type`: リクエストのエンティティは問題ありません (サーバーは JSON を認識しています)。
  • `416 Requested Range Not Satisfiable`:`Range`リクエストヘッダーについて。
  • `417 Expectation Failed`: `Expect` リクエスト ヘッダーについて。
  • `423 Locked (WebDAV)` *423 (Locked) ステータス コードは、メソッドのソースまたは宛先リソースがロックされていることを意味します*: ここでは何もロックされていません。
  • `424 Failed Dependency (WebDAV)` *424 (Failed Dependency) ステータス コードは、要求されたアクションが別のアクションに依存しており、そのアクションが失敗したため、リソースに対してメソッドを実行できなかったことを意味します*:現在のコンテキスト。
  • 于 2013-05-19T20:13:56.147 に答える