良い習慣からを再利用するRFC HTTPステータスコードを再利用することを考慮すべきですか?これ、または私たちは特定のエラー理由に正確にマップする新しいものを作成する必要がありますか?
いくつかのレガシーアプリケーションを中心にウェブサービスAPIを設計しています。
応答本文のJSON/XMLデータ構造に加えて、Webキャッシュおよび開発者に意味のあるHTTPステータスコードを返すことを目指しています。
しかし、さまざまなクラスのエラーを適切なHTTPステータスコードにマッピングするにはどうすればよいでしょうか。チームの全員が次のことに同意します。
GET/package/1234は、1234が見つからない場合に404 Not Foundを返します存在する
GET/package/1234/next_checkpointは400 Bad Requestを返します "next_checkpoint "and1234は要求に有効ですが、next_checkpontはここでは意味がありません...
など...しかし、場合によっては、物事を単なる "400"よりも具体的にする必要があります-たとえば:
POST/dispatch /?for_package = 1234returns412 Precondition Failedif /ディスパッチとパッケージ1234の両方が存在しますが、1234はまだディスパッチの準備ができていません。
(編集: HTTP/1.1のステータスコード および WebDAV ext。のステータスコード)
HTTPをRESTで使用するには、APIを統一する必要があります。これは、ドメイン固有のメソッド(ala GET_STOCK_QUOTE)を追加できないことを意味しますが、ドメイン固有のエラーコード(ala 499 Product Out Of Stock)を追加できないことも意味します。
実際、リソースのセマンティクスを適切に設計すると、HTTPエラーコードの意味がエラーを正しく表すため、HTTPクライアントエラーコードは優れた設計チェックです。追加のエラーコードが必要だと思われる場合は、リソース設計が間違っている可能性があります。
ヤン
422 Unprocessable Entityは、このようなシナリオに役立つエラーコードです。詳細については、この質問 ドメインルールが無効な場合のRESTサービスのputサービスのHTTP応答コード を参照してください。
GET/package/1234/next_checkpointは、「next_checkpoint」と1234が要求に有効であるが、ここでのnext_checkpontが意味をなさない場合、400 Bad Requestを返します...
これは、そのURIについて考えるのに間違った方法です。
URIは不透明であるため、その一部が「有効」であり、他のURIは無効であることを観察しても、クライアントの観点からは意味がありません。したがって、リソース「package/1234/next_checkpoint」が存在しないため、クライアントに404を「ただ」返す必要があります。
特定のヘッダーや条件を対象とした応答を使用しないように注意してください。人間が読めるステータスメッセージと、アプリケーションコンテキストに応じて、応答本文としてエラーのプレーンテキストバージョンまたは構造化エラーメッセージを返す傾向があります。
更新:RFCをさらに読むと、「procondition failed」は「if-none-match」などの条件付きヘッダーを意味します。代わりに、一般的な400メッセージを送信します。
実際には、これを行うべきではありません。 404 Not Found
の使用は正しいですが、400 Bad Request
が不適切に使用されています。 RFCに準拠した400 Bad Request
は、HTTPプロトコルの形式が正しくない場合にのみ使用されます。あなたの場合、リクエストは構文的に正しいです、それは単なる予期しない引数です。 500 Server Error
を返し、REST結果にエラーコードを含める必要があります。