web-dev-qa-db-ja.com

外部依存関係エラーのHTTPステータスコード

サーバーが外部APIとの通信に問題があるときに返す正しいHTTPステータスコードは何ですか?

クライアントがサーバーAに有効なリクエストを送信し、AがサーバーBのAPIにクエリを実行して何かを行うとします。ただし、BのAPIが現在500をスローしている、または何らかの理由で到達できない場合、どのステータスコードをAがクライアントに返す必要がありますか?サーバーAが正常に機能しているため、5 *エラーは正しくないようです。また、クライアントがAに有効なリクエストを送信しているため、4 *エラーは正しくないようです。

26
rectangletangle

APIは利用できないものに依存しているため、そのサービスも利用できません。

状況コード503:Service Unavailableがあなたの状況に最も適していると思います。 RFCの説明 から:

サーバーの一時的な過負荷またはメンテナンスのため、サーバーは現在リクエストを処理できません。これは、これが一時的な状態であり、少し遅れて緩和されることを意味しています。既知の場合、遅延の長さはRetry-Afterヘッダーで示される場合があります。 Retry-Afterが指定されていない場合、クライアントは500応答の場合と同様に応答を処理する必要があります(SHOULD)。

確かに、この説明は、このステータスコードはサーバー自体のエラーに適用する必要があることを示しています(外部依存関係の問題を通知するものではありません)。ただし、これはRFCステータスコードに最適であり、誰でも理解できるようにカスタムステータスコードを使用することはお勧めしません。

または、APIがエラーを伝える方法をサポートしている場合(たとえば、ユーザーが指定したIDが正しくないことをユーザーに通知するため)、このメソッドを使用して、依存関係が利用できないことをユーザーに通知できる場合があります。オーディエンスによっては、403、404、および500以外のステータスコードに精通していないユーザーがいるため、これは少し親しみやすく、ユーザー側でのバグ検索を回避できる可能性があります。

24
ljacqu

ステータスコード 502 および 504 を検討しましたか?

502 – The server while acting as a gateway or a proxy, 
received an invalid response from the upstream server it accessed
in attempting to fulfill the request.

504 – The server, while acting as a gateway or proxy, 
did not receive a timely response from the upstream server 
specified by the URI (e.g. HTTP, FTP, LDAP) 
or some other auxiliary server (e.g. DNS) it needed to access 
in attempting to complete the request.

もちろん、これには、アプリケーションレイヤーに適用される「ゲートウェイ」(インターフェースBへの呼び出しを必要とするインターフェースAの実装)の幅広い解釈が必要です。しかし、これは「私は答えることはできませんが、それは私のせいでもあなたのせいでもない」と言うにはいい方法かもしれません。

29
Aurélien

このリンクを参照してください。

HTTPステータス424または500(外部依存関係のエラーの場合

503 Service Unavailableは、状況に最適に見えます。

2
user636856