Mã trạng thái HTTP REST được đề xuất cho 'đã đạt đến giới hạn yêu cầu'


43

Tôi đang kết hợp một thông số kỹ thuật cho dịch vụ REST, một phần trong đó sẽ kết hợp khả năng điều tiết người dùng trên toàn dịch vụ và trên các nhóm, hoặc trên từng tài nguyên riêng lẻ. Tương tự, thời gian chờ cho những thứ này sẽ có thể được cấu hình cho mỗi tài nguyên / nhóm / dịch vụ.

Tôi chỉ xem qua thông số HTTP 1.1 và cố gắng quyết định cách tôi sẽ liên lạc với khách hàng rằng yêu cầu sẽ không được thực hiện vì họ đã đạt đến giới hạn của họ.

Ban đầu tôi đoán rằng mã máy khách 403 - Forbiddenlà mã , nhưng cái này, từ thông số kỹ thuật:

Ủy quyền sẽ không giúp đỡ và yêu cầu KHÔNG NÊN lặp lại

làm phiền tôi

Nó thực sự có vẻ 503 - Service Unavailablelà một cách tốt hơn để sử dụng - vì nó cho phép giao tiếp thời gian thử lại thông qua việc sử dụng Retry-Aftertiêu đề.

Có thể trong tương lai tôi có thể tìm cách hỗ trợ 'mua' nhiều yêu cầu hơn thông qua Thương mại điện tử (trong trường hợp đó sẽ rất tuyệt nếu mã khách hàng 402 - Payment Requiredđã được hoàn tất!) - nhưng tôi cho rằng điều này cũng có thể được đưa vào phản hồi 503.

Mà bạn nghĩ tôi nên sử dụng? Hoặc có một cái khác tôi đã không xem xét?

Câu trả lời:


77

429 quá nhiều yêu cầu

Người dùng đã gửi quá nhiều yêu cầu trong một khoảng thời gian nhất định. Dự định sử dụng với các chương trình giới hạn tỷ lệ. Mã này đã được chấp nhận trong RFC 6585 Mã trạng thái HTTP bổ sung .

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

Âm thanh tuyệt vời - Tôi sẽ ghi nhớ nó! Nó đi kèm với mèo miễn phí? Hay chúng là một phần mở rộng cho giao thức?
Andras Zoltan

3
Mèo trạng thái HTTP - cho tất cả các nhu cầu trạng thái của bạn: flickr.com/photos/girliemac/sets/72157628409467125
Sean McMillan

1
vừa đi vòng quanh văn phòng với nhiều tiếng cười và tiếng vỗ tay - thiên tài!
Andras Zoltan

Cuối cùng tôi đã đi với một chiếc 429 - nó nằm trong bản dự thảo nhưng tôi thực sự nghi ngờ rằng nó cuối cùng sẽ được sử dụng cho bất cứ thứ gì khác.
Andras Zoltan

7

Ở một mức độ nào đó, bạn có thể tự do làm những gì bạn thích với các mã, nhưng tôi đồng ý rằng bạn có thể sử dụng 503, hoặc nếu bạn muốn 402, mà không ai có thể phàn nàn rằng bạn đang phá vỡ mọi thứ.

Chỉnh sửa: Một người theo chủ nghĩa thuần túy có thể nói rằng bạn nên bắt đầu bằng 503, sau đó chuyển đổi một lần để có thể thực hiện thanh toán.


Một bổ sung tuyệt vời cho điều này trong các ý kiến:

4xx chỉ ra lỗi do máy khách có thể khắc phục bằng cách họ thực hiện một hành động nhất định, trong khi 5xx chỉ ra sự cố trên máy chủ mà máy khách không thể giúp giải quyết. Vì vậy, trong trường hợp của bạn, 4xx là phù hợp hơn, bởi vì (i) máy chủ đang hoạt động chính xác như bình thường và (ii) khách hàng có thể "sửa" lỗi bằng cách làm chậm hoặc mua thêm tín dụng. Độ phân giải chính xác có thể được chỉ định trong phần thân của phản hồi 429. - Mike Chamberlain 7 giờ trước


503! 503! 503! Đạt đến giới hạn, cuộc gọi tiếp theo bị cấm. Đơn giản và đơn giản ...
yannis

@YannisRizos: Ah, nhưng nó không bị cấm một khi thanh toán đã được thực hiện!
Marcin

1
Mã lỗi đại diện cho kết quả của yêu cầu duy nhất. Nếu thanh toán được thực hiện, thì trong một yêu cầu tiếp theo, đó là hoạt động kinh doanh như bình thường ... Nếu bạn ghi lại hành vi, tôi sẽ ổn thôi. Hoặc bạn chỉ có thể trả lại 200, với một thông báo lỗi. Nhưng điều đó không đẹp. Mặc dù một số người có thể nói sử dụng mã lỗi HTTP cho logic nghiệp vụ không đẹp. À, cá nhân tôi đi với 503, dịch vụ không có sẵn tại thời điểm này - cho đến khi khóa học thường được hỗ trợ.
yannis

@YannisRizos (& Marcin) - cảm ơn vì những bình luận của bạn - Tôi cho rằng 503 là thứ tốt nhất để đi cùng; đồng thời hiểu rằng việc triển khai bản chất RESTful thường có thể trở nên tồi tệ khi sử dụng mã trạng thái HTTP. Quan điểm cá nhân của tôi về điều này là sử dụng những gì giao thức cung cấp trừ khi nó không phù hợp (điều này thực sự rất hiếm). Trong trường hợp này, nó chắc chắn làm!
Andras Zoltan

5
4xx chỉ ra lỗi do máy khách có thể khắc phục bằng cách họ thực hiện một hành động nhất định, trong khi 5xx chỉ ra sự cố trên máy chủ mà máy khách không thể giúp giải quyết. Vì vậy, trong trường hợp của bạn, 4xx là phù hợp hơn, bởi vì (i) máy chủ đang hoạt động chính xác như bình thường và (ii) khách hàng có thể "sửa" lỗi bằng cách làm chậm hoặc mua thêm tín dụng. Độ phân giải chính xác có thể được chỉ định trong phần thân của phản hồi 429.
Mike Chamberlain
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.