RESTベースのAPIを使ったアプリケーションを作っているのですが、各リクエストにステータスコードを指定するところまで来ました。
検証に失敗したリクエストや、データベースに重複したデータを追加しようとしたリクエストには、どのようなステータスコードを送ればよいのでしょうか?
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html を見てみましたが、どれもしっくりきません。
ステータスコードを送信する際の一般的な方法はありますか?
入力検証失敗の場合400 Bad Request + 任意の説明文を入力します。これは、書籍「RESTful Web Services」で提案されています。 二重投稿の場合409 Conflictを参照してください。
**2014年6月更新
以前はRFC2616という仕様があり、400(Bad Request)の用途を以下のように限定していました。
400(Bad Request)とは、以下のようなものです。
そのため、意味的なエラーには不適切であると主張されていたかもしれません。しかし、今は違います。2014年6月以降、以前のRFC2616に代わる関連規格RFC 7231では、400(Bad Request)の使用方法をより広範囲に次のように示しています。
サーバーが何かの原因でリクエストを処理できないか と認識される何かが原因で、サーバーがリクエストを処理できない、または処理しない。 クライアントのエラー
レスポンスのヘッダーやボディで、より詳細な説明をする必要があります(例:カスタムヘッダー - X-Status-Reason: Validation failed
を使用)。
ステータスコード422、"Unprocessable Entity"]1をお勧めします。
11.2.422 処理不可能なエンティティ
422(Unprocessable Entity)ステータスコードは、サーバーがリクエストエンティティのコンテンツタイプを理解し(したがって415(Unsupported Media Type)ステータスコードは不適切)、リクエストエンティティのシンタックスは正しい(したがって400(Bad Request)ステータスコードは不適切)が、含まれる命令を処理できなかったことを意味します。例えば、このエラー状態は、XMLリクエストボディに、整形された(すなわち、構文的に正しい)が、意味的に誤ったXML命令が含まれている場合に発生する可能性がある。