web-dev-qa-db-ja.com

推奨されるHTTP REST「リクエスト制限に達しました」のステータスコード

RESTサービスの仕様をまとめています。その一部には、サービス全体およびリソースのグループ、または個別のリソースに対してユーザーを調整する機能が組み込まれています。同様に、タイムアウトこれらは、リソース/グループ/サービスごとに構成可能です。

私はただHTTP 1.1仕様を調べて、リクエストが制限に達したためにリクエストが実行されないことをクライアントに伝える方法を決定しようとしています。

最初は、クライアントコード403 - Forbiddenが仕様であると考えましたが、これは次のとおりです。

承認は役に立たず、リクエストは繰り返されるべきではありません

気になりました。

503 - Service Unavailableヘッダーを使用して再試行時間を通知できるため、実際にはRetry-Afterの方が適しています。

将来的には、eコマースを介してより多くのリクエストの「購入」をサポートすることを検討する可能性があります(その場合、クライアントコード402 - Payment Requiredが確定されていればいいです)。 503応答も。

私はどちらを使うべきだと思いますか?または私が考慮していない別のものはありますか?

45
Andras Zoltan

429リクエストが多すぎます

ユーザーが一定時間内に送信したリクエストが多すぎます。レート制限スキームでの使用を目的としています。このコードは RFC 6585追加のHTTPステータスコードで受け入れられました。

http://i.stack.imgur.com/Y84Lj.jpg

   The 429 status code indicates that the user has sent too many
   requests in a given amount of time ("rate limiting").

   The response representations SHOULD include details explaining the
   condition, and MAY include a Retry-After header indicating how long
   to wait before making a new request...

   Note that this specification does not define how the Origin server
   identifies the user, nor how it counts requests.  For example, an
   Origin server that is limiting request rates can do so based upon
   counts of requests on a per-resource basis, across the entire server,
   or even among a set of servers.  Likewise, it might identify the user
   by its authentication credentials, or a stateful cookie.

   Responses with the 429 status code MUST NOT be stored by a cache...
79
Sean McMillan

ある程度、コードで好きなことを自由に行うことができますが、503を使用すること、または402を使用する場合は、誰もあなたが物事を壊す。

編集:純粋主義者は、503から始めて、支払いが可能になったら切り替えるべきだと言うかもしれません。


コメントでこれに優れた追加:

4xxはクライアントが特定のアクションを実行することで修正できるエラーを示し、5xxはクライアントが解決できないサーバー上の問題を示します。したがって、あなたのケースでは、(i)サーバーが正しく動作していること、および(ii)クライアントが速度を落とすか、クレジットを追加購入することでエラーを「修正」できるため、4xxがより適切です。正確な解像度は、429応答の本文で示すことができます。 – 7時間前マイクチェンバレン

7
Marcin