web-dev-qa-db-ja.com

REST APIエラーコード500の処理

新しいREST API。

エラーコード500(内部サーバーエラー)が返されるべきではないと主張していました。

さて、もちろん、クライアントのパラメーターが間違っているか何かを管理している場合は、すべてを制御し、適切なエラーコード(422など)を返すことができます。

したがって、予期しないエラーが発生した場合、サーバーは次のことを実行できます。

  1. 500がクライアントにバブルするように、予期しないエラーをキャッチしない
  2. 予期しないエラーをキャッチし、「予期しない状況」を示すエラーコードを返します(正直なところ、このようなエラーコードは見つかりませんでした!)

他のオプションはありますか?

14
faboolous

これはサーバーエラーであり、クライアントエラーではありません。サーバーエラーがクライアントに返されない場合、それらのステータスコードクラス全体(5xxなど)は作成されていません。

プログラミングエラーが発生したか、依存しているサービスが利用できないという事実を隠すことはできません。それは確かにクライアントのせいではありません。これらの場合、5xxシリーズ以外の範囲のコードを返すことは意味がありません。

RFC 7231はセクション6.6で言及しています。サーバーエラー5xx

ステータスコードの5xx(サーバーエラー)クラスは、サーバーがエラーを認識しているか、要求されたメソッドを実行できないことを認識していることを示します

これはまさにそうです。コード「500 Internal Server Error」については、クライアントに公開すべきではないという意味で「内部」というものはありません。

14
CodeCaster

本当の問題は、なぜ500エラーを生成するのかということです。入力パラメーターに関連する場合、内部的に処理し、400シリーズエラーとして返されると主張します。一般的な規則では、RESTfulリソースはURLによって一意に識別され、有効な応答を生成できないURLは不正な要求(400)などであるため、一般に400、404、または406が不正な入力を反映するのに適しています。

エラーが、要求によって明示的または暗黙的に提供された入力以外の何かによって引き起こされた場合、500エラーが適切であると言えます。したがって、データベース接続の失敗またはその他の予測できないエラーは、500シリーズエラーで正確に表されます。

5
tokkov

「予期しないエラーをキャッチし、「予期しない状況」を示すエラーコードを返す」ことを提案しましたが、適切なエラーコードが見つかりませんでした。

推測:それが5xxの目的です。

3
gnasher729

一般的に、5xx応答コードは、データベース接続障害やその他のシステム/ライブラリ依存関係の障害など、プログラム以外の障害を示します。多くの場合、クライアントは将来同じリクエストを再送信し、成功することを期待できます。

はい、一部のWebフレームワークは5xxコードで応答しますが、これらは通常、コードの欠陥の結果であり、フレームワークは抽象的すぎて何が起こったかを知ることができないため、デフォルトでこのタイプの応答になります。ただし、この例は、プロセス外システムとは関係のないプログラム的な動作の結果として5xxコードを返す習慣があるという意味ではありません。 5xxコードよりも適切な、明確に定義された多くの応答コードがあります。特定の入力を解析/検証できないことは、コードがより適切な応答に対応できるため、クライアントが同じ要求を再送信できるとは思わないまま、実際にはできないという5xx応答ではありません。

明確にするために、サーバーで発生したエラーがCLIENT入力によるものである場合、これは明らかにCLIENTエラーであり、4xx応答コードで処理する必要があります。期待は、クライアントがリクエストのエラーを修正して再送信することです。

ただし、プロセス外エラーをキャッチして5xx応答として解釈することは完全に許容できますが、応答にさらに情報を含めて、失敗したものを正確に示す必要があることに注意してください。さらに、アドレスにSLA回を含めることができればさらに良いでしょう。

バグが発生するため、「予期しないエラー」を5xxエラーと解釈するのは良い習慣ではないと思います。

5xxタイプのエラーのアラートを開始するのは一般的なアラートモニターです。これらのエラーは通常、エラーコードではなくシステムの障害を示しているためです。したがって、それに応じてコーディングしてください!

2
ILoveCode

80%の時間、これはsoapRequest.xmlファイルでの間違った入力によるものです。

0
dynamicJos