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


43

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

HTTP 1.1仕様を調べて、クライアントが制限に達したために要求が満たされないことをクライアントに伝える方法を決定しようとしています。

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

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

私を悩ませた。

実際に503 - Service Unavailableは、使用するほうが良いようです- Retry-Afterヘッダーを使用することで再試行時間の通信が可能になるためです。

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

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

回答:


77

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

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

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...

素晴らしいサウンド-心に留めておきます!無料の猫が付属していますか?それともプロトコルの拡張ですか?
アンドラスゾルタン

3
HTTPステータス猫-すべてのあなたのステータスのニーズに:flickr.com/photos/girliemac/sets/72157628409467125
ショーン・マクミラン

1
それはたった今、オフィスを駆け巡って大いに笑い、拍手toしました。天才です!
アンドラスゾルタン

私は最終的に429を使用しました-これはドラフト仕様にありますが、最終的には他の用途に使用されることを真剣に疑います。
アンドラスゾルタン

7

ある程度まで、あなたはコードで好きなことを自由に行うことができますが、あなたが物を壊していると不平を言うことなく誰でもあなたが使うことができる503か、あなたが望むなら、同意するでしょう402

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


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

4xxはクライアントが特定のアクションを実行することで修正できるエラーを示し、5xxはクライアントが解決できないサーバー上の問題を示します。したがって、あなたの場合、4xxの方が適切です。なぜなら(i)サーバーは正確に動作しているからです。429応答の本文に正確な解像度を示すことができます。–マイクチェンバレン7時間前


503!503!503!制限に達すると、次の呼び出しは禁止されます。プレーンでシンプルな
...-ヤニス

@YannisRizos:ああ、でも支払いが済んだら禁止されていません!
マーチン

1
エラーコードは、単一のリクエストの結果を表します。支払いが行われた場合、その後のリクエストで通常通りのビジネスになります...動作を文書化する場合、私はそれで問題ありません。または、エラーメッセージとともに200を返すだけでもかまいません。しかし、それはきれいではありません。ビジネスロジックにHTTPエラーコードを使用するのは難しいと言う人もいますが。ああ、個人的には503を使いますが、現時点ではサービスは利用できません-もちろん402が一般的にサポートされるまでです。
ヤニス

@YannisRizos(&Marcin)-コメントありがとうございます-503が最適だと思いました。また、RESTfulな性質の実装は、HTTPステータスコードの使用に関しては、毛並みの悪いことになることが多いことも理解しています。これに関する私の個人的な見方は、プロトコルが適合しない場合を除き、プロトコルが提供するものを使用することです(実際には非常にまれです)。この場合、間違いなくそうです!
アンドラスゾルタン

5
4xxは、クライアントが特定のアクションを実行することで修正できるエラーを示し、5xxは、クライアントで解決できないサーバー上の問題を示します。したがって、あなたの場合、4xxの方が適切です。なぜなら(i)サーバーは正確に動作しているからです。429応答の本文に正確な解像度を示すことができます。
マイク・チェンバレン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.