Mã trạng thái HTTP được đề xuất cho giới hạn gói của Vượt quá giới hạn


24

Tôi đang thiết kế API REST cho một dự án nơi người dùng luôn ở một trong một số "gói" - mỗi gói xác định một số giới hạn tài nguyên, chẳng hạn như số lượng người dùng tối đa mà tài khoản có thể có hoặc số lượng dữ liệu tối đa họ có thể tải lên. Khi đạt được một trong những giới hạn này, người dùng có thể nâng cấp gói của họ (về cơ bản là trả tiền) để có thêm tài nguyên.

Tôi muốn trả về mã trạng thái đặc biệt chỉ ra tình huống không thể thực hiện hành động do giới hạn tài nguyên tài khoản và việc nâng cấp gói sẽ giải quyết điều này - ví dụ: nếu người dùng sử dụng 100% dung lượng lưu trữ của họ và cố gắng tải lên một tệp bổ sung , họ sẽ nhận được phản hồi này.

Các ứng cử viên là, IMHO:

  • 403 Forbidden - tuy nhiên, tôi muốn phân biệt giữa trường hợp này và các trường hợp khác mà người dùng chỉ đơn giản là không có quyền để thực hiện hành động này.

  • 401 Unauthorized - không phải là một ý tưởng tốt, chúng tôi đang sử dụng điều này để xác thực các vấn đề liên quan.

  • 402 Payment Required - có ý nghĩa nhưng tôi lo lắng về việc sử dụng mã trạng thái không chuẩn nhưng được bảo lưu

  • Một cái gì đó thậm chí ít tiêu chuẩn hơn như 423 Lockedkhông có khả năng chúng ta sẽ sử dụng nó cho bất cứ điều gì khác trong tương lai

Một lựa chọn khác là đi với một cái gì đó rất chuẩn như 403nhưng chỉ ra các chi tiết cụ thể của lỗi trong phần thân phản hồi.

Tôi đang tự hỏi cách tiếp cận nào bạn tin rằng (a) sẽ hoạt động tốt nhất trong thời gian dài và (b) sẽ gắn bó hơn với các nguyên tắc RESTful.


1
Có HTTP 507 Lưu trữ không đủ.
CodeInChaos

RFC4331 có thể có liên quan, đó là về giới hạn hạn ngạch cho WebDAV.
CodeInChaos

@CodesInChaos đây không phải là lỗi 5xx và lưu trữ chỉ là một ví dụ (thực tế dự án không phải là về lưu trữ, thực tế nó chỉ là một sự tương tự tốt).
shevron

Mã trạng thái phản hồi HTTP 429 Quá nhiều yêu cầu cho biết người dùng đã gửi quá nhiều yêu cầu trong một khoảng thời gian nhất định
ExtractTable.com

Câu trả lời:


17

Tôi nghĩ 403 là phản hồi hợp lý duy nhất, mặc dù 405 Phương pháp không được phép hoặc 409 Xung đột có thể được chấp nhận, tôi không nghĩ rằng cũng tốt như 403 mà nói:

Máy chủ hiểu yêu cầu, nhưng từ chối thực hiện nó. Ủy quyền sẽ không giúp đỡ và yêu cầu KHÔNG NÊN lặp lại. Nếu phương thức yêu cầu không phải là CHÍNH và máy chủ muốn công khai lý do tại sao yêu cầu chưa được thực hiện, thì NÊN mô tả lý do từ chối trong thực thể

Nếu bạn trả về lỗi 403, nó sẽ bao gồm một số thông tin về lý do tại sao tài nguyên bị từ chối - quyền không hợp lệ chỉ là trường hợp phổ biến nhất, vượt quá giới hạn không khác nhau nhiều - bạn không có quyền vì giới hạn của bạn đã vượt quá.


22

Tôi tin 403 là sai, vì 403 dành cho các tình huống mà bạn không có quyền truy cập vào tài nguyên và không có cách nào để có quyền truy cập. Đối với khách hàng của bạn, rõ ràng có một cách để có quyền truy cập: Trả tiền.

401 thực sự sai, bởi vì không chỉ bạn đang sử dụng nó để xác thực, mà đó là những gì nó đang có.

Vì bạn đang viết API, tôi giả định rằng người khác sẽ phải viết mã sử dụng API và người đó cần đọc thông số API của bạn. Bạn có thể đi với 429 "Quá nhiều yêu cầu". Nó thường được dùng để giới hạn tỷ lệ (ví dụ, nơi khách hàng có thể thực hiện 100 yêu cầu mỗi ngày), nhưng áp dụng hợp lý cho tình huống của bạn. 404 (Yêu cầu thanh toán) cũng sẽ được chấp nhận, tôi nghĩ vậy. Phụ thuộc vào những công cụ bạn mong đợi mọi người sử dụng để sử dụng API của bạn. 429 có nguy cơ rằng một công cụ thông minh cố gắng gửi ít yêu cầu hơn mỗi phút / giờ / ngày và không bao giờ thành công.

BTW theo https://tools.ietf.org/html/rfc6585 lỗi 429 cũng sẽ chứa thông báo html mô tả bản chất của sự cố, vì vậy rất có khả năng người dùng thực sự được thông báo vấn đề là gì, nếu bạn cung cấp thông tin đó trong phản hồi của bạn.


1
402là một tùy chọn nhưng tôi thích dự trữ 429cho các mục đích giới hạn tỷ lệ thực tế mà chúng tôi có khả năng sẽ thêm vào trong tương lai
shevron

Google dường như sử dụng403 mặc dù tôi thích 429tốt hơn nhiều. Tôi đã thấy một số triển khai tùy chỉnh của các máy khách http đã thực hiện một số nội dung kỳ lạ trên 401403(ví dụ: một trang web sẽ đăng xuất người dùng nếu nó nhận được 401 hoặc 403 từ api).
Cristian Vrabie

0

WebDAV sử dụng Bộ lưu trữ không đủ HTTP 507 cho việc này và bao gồm mã lỗi bổ sung cho hạn ngạch vượt quá trong phần yêu cầu, để phân biệt với các loại giới hạn lưu trữ khác.


12
Có vẻ trái ngược khi sử dụng mã 5xx cho việc này.
Ben Aaronson
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.