web-dev-qa-db-ja.com

REST:アプリケーションエラーをHTTPステータスコードにマッピングする

良い習慣からを再利用するRFC HTTPステータスコードを再利用することを考慮すべきですか?これ、または私たちは特定のエラー理由に正確にマップする新しいものを作成する必要がありますか?

いくつかのレガシーアプリケーションを中心にウェブサービスAPIを設計しています。

応答本文のJSON/XMLデータ構造に加えて、Webキャッシュおよび開発者に意味のあるHTTPステータスコードを返すことを目指しています。

しかし、さまざまなクラスのエラーを適切なHTTPステータスコードにマッピングするにはどうすればよいでしょうか。チームの全員が次のことに同意します。

GET/package/1234は、1234が見つからない場合に404 Not Foundを返します存在する

GET/package/1234/next_checkpoint400 Bad Requestを返します "next_checkpoint "and1234は要求に有効ですが、next_checkpontはここでは意味がありません...

など...しかし、場合によっては、物事を単なる "400"よりも具体的にする必要があります-たとえば:

POST/dispatch /?for_package = 1234returns412 Precondition Failedif /ディスパッチとパッケージ1234の両方が存在しますが、1234はまだディスパッチの準備ができていません。


編集: HTTP/1.1のステータスコード および WebDAV ext。のステータスコード

36
conny

HTTPをRESTで使用するには、APIを統一する必要があります。これは、ドメイン固有のメソッド(ala GET_STOCK_QUOTE)を追加できないことを意味しますが、ドメイン固有のエラーコード(ala 499 Product Out Of Stock)を追加できないことも意味します。

実際、リソースのセマンティクスを適切に設計すると、HTTPエラーコードの意味がエラーを正しく表すため、HTTPクライアントエラーコードは優れた設計チェックです。追加のエラーコードが必要だと思われる場合は、リソース設計が間違っている可能性があります。

ヤン

25
Jan Algermissen

422 Unprocessable Entityは、このようなシナリオに役立つエラーコードです。詳細については、この質問 ドメインルールが無効な場合のRESTサービスのputサービスのHTTP応答コード を参照してください。

17
Darrel Miller

GET/package/1234/next_checkpointは、「next_checkpoint」と1234が要求に有効であるが、ここでのnext_checkpontが意味をなさない場合、400 Bad Requestを返します...

これは、そのURIについて考えるのに間違った方法です。

URIは不透明であるため、その一部が「有効」であり、他のURIは無効であることを観察しても、クライアントの観点からは意味がありません。したがって、リソース「package/1234/next_checkpoint」が存在しないため、クライアントに404を「ただ」返す必要があります。

5
Mike

特定のヘッダーや条件を対象とした応答を使用しないように注意してください。人間が読めるステータスメッセージと、アプリケーションコンテキストに応じて、応答本文としてエラーのプレーンテキストバージョンまたは構造化エラーメッセージを返す傾向があります。

更新:RFCをさらに読むと、「procondition failed」は「if-none-match」などの条件付きヘッダーを意味します。代わりに、一般的な400メッセージを送信します。

4
Steve Pomeroy

実際には、これを行うべきではありません。 404 Not Foundの使用は正しいですが、400 Bad Requestが不適切に使用されています。 RFCに準拠した400 Bad Requestは、HTTPプロトコルの形式が正しくない場合にのみ使用されます。あなたの場合、リクエストは構文的に正しいです、それは単なる予期しない引数です。 500 Server Errorを返し、REST結果にエラーコードを含める必要があります。

0
David Pfeffer