36

このようなRFC HTTP ステータス コードを再利用することは良い習慣と見なされますか?それとも、特定のエラーの理由に正確に対応する新しいコードを作成する必要がありますか?

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

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

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

GET /package/1234は、1234 が存在しない場合、404 Not Foundを返します

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

など...しかし、場合によっては、単に「400」よりも具体的にする必要があります-例:

POST /dispatch/?for_package=1234は、/dispatch とパッケージ 1234 の両方が存在する場合、 412 Precondition Failedを返しますが、1234 はまだ発送の準備ができていません。


(編集: HTTP/1.1ステータス コードと WebDAV ext のステータス コード)

4

5 に答える 5

25

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

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

1月

于 2010-03-04T17:18:44.320 に答える
19

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

于 2010-03-04T21:50:53.183 に答える
5

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

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

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

于 2010-03-05T09:04:27.600 に答える
4

クライアントが間違いを犯した場合は、要求に最もよく一致する 4xx シリーズの応答を使用する必要がありますが、特定のヘッダーや条件を対象とした応答を使用しないように注意してください。アプリケーションのコンテキストに応じて、人間が判読できるステータス メッセージと、プレーンテキスト バージョンのエラーを応答本文として返すか、構造化されたエラー メッセージを返す傾向があります。

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

于 2010-03-04T15:57:13.097 に答える
0

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

于 2010-03-04T15:48:52.020 に答える