Kode status HTTP REST yang disarankan untuk 'batas permintaan tercapai'

43

Saya mengumpulkan spesifikasi untuk layanan REST, yang sebagiannya akan menggabungkan kemampuan untuk membatasi pengguna di seluruh layanan dan pada kelompok, atau pada sumber daya individu. Sama halnya, batas waktu untuk ini dapat dikonfigurasi per sumber daya / grup / layanan.

Saya hanya melihat melalui spesifikasi HTTP 1.1 dan mencoba memutuskan bagaimana saya akan berkomunikasi dengan klien bahwa permintaan tidak akan dipenuhi karena mereka telah mencapai batasnya.

Awalnya saya menemukan bahwa kode klien 403 - Forbiddenadalah satu, tetapi ini, dari spec:

Otorisasi tidak akan membantu dan permintaan TIDAK HARUS diulang

mengganggu ku.

Tampaknya benar-benar yang 503 - Service Unavailablelebih baik untuk digunakan - karena memungkinkan untuk komunikasi waktu coba lagi melalui penggunaan Retry-Afterheader.

Mungkin saja di masa depan saya mungkin akan mendukung 'pembelian' lebih banyak permintaan melalui eCommerce (dalam hal ini akan lebih baik jika kode klien 402 - Payment Requiredtelah difinalisasi!) - tetapi saya pikir ini juga dapat diperas menjadi tanggapan 503.

Menurut Anda mana yang harus saya gunakan? Atau ada lagi yang belum saya pertimbangkan?

Andras Zoltan
sumber

Jawaban:

77

429 Terlalu Banyak Permintaan

Pengguna telah mengirim terlalu banyak permintaan dalam jumlah waktu tertentu. Ditujukan untuk digunakan dengan skema pembatasan tingkat. Kode ini telah diterima dalam Kode Status HTTP Tambahan RFC 6585 .

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...
Sean McMillan
sumber
Kedengarannya luar biasa - saya akan mengingatnya! Apakah ini disertai dengan kucing gratis? Atau mereka ekstensi ke protokol?
Andras Zoltan
3
Kucing Status HTTP - untuk semua kebutuhan status Anda: flickr.com/photos/girliemac/sets/72157628409467125
Sean McMillan
1
yang baru saja berkeliling kantor untuk banyak tawa dan tepuk tangan - jenius!
Andras Zoltan
Saya pergi dengan 429 pada akhirnya - itu dalam spesifikasi rancangan tapi saya benar-benar ragu akhirnya akan digunakan untuk hal lain.
Andras Zoltan
7

Hingga taraf tertentu, Anda bebas melakukan apa yang Anda suka dengan kode-kode itu, tetapi saya akan setuju bahwa Anda dapat menggunakan 503, atau jika Anda mau 402, tanpa ada orang yang bisa mengeluh bahwa Anda melanggar sesuatu.

Sunting: Seorang purist mungkin mengatakan bahwa Anda harus mulai dengan 503, lalu beralih begitu memungkinkan untuk melakukan pembayaran.


Tambahan yang bagus untuk ini di komentar:

4xx menunjukkan kesalahan oleh klien yang dapat diperbaiki oleh mereka mengambil tindakan tertentu, sedangkan 5xx menunjukkan masalah pada server yang klien tidak dapat membantu menyelesaikannya. Jadi dalam kasus Anda, 4xx lebih tepat, karena (i) server berperilaku tepat sebagaimana mestinya, dan (ii) klien dapat "memperbaiki" kesalahan dengan memperlambat atau membeli lebih banyak kredit. Resolusi yang tepat dapat ditunjukkan dalam tubuh tanggapan 429. - Mike Chamberlain 7 jam yang lalu

Marcin
sumber
503! 503! 503! Mencapai batas, panggilan berikutnya dilarang. Polos dan sederhana ...
yannis
@YannisRizos: Ah, tapi itu tidak dilarang begitu pembayaran dilakukan!
Marcin
1
Kode kesalahan mewakili hasil dari permintaan tunggal. Jika pembayaran dilakukan, maka atas permintaan berikutnya itu bisnis seperti biasa ... Jika Anda mendokumentasikan perilaku itu, tidak masalah bagi saya. Atau Anda bisa mengembalikan 200, dengan pesan kesalahan. Tapi itu tidak cantik. Meskipun beberapa orang mungkin mengatakan menggunakan kode kesalahan HTTP untuk logika bisnis tidak cantik. Ah well, saya pribadi akan menggunakan 503, layanan tidak tersedia saat ini - sampai tentu saja 402 umumnya didukung.
yannis
@YannisRizos (& Marcin) - terima kasih atas komentar Anda - Saya pikir 503 adalah yang terbaik untuk digunakan; sementara itu juga memahami bahwa implementasi yang bersifat RESTful seringkali dapat menjadi tidak benar ketika menyangkut penggunaan kode status HTTP. Pandangan pribadi saya tentang ini adalah untuk menggunakan apa yang disediakan protokol kecuali itu tidak cocok (yang sebenarnya sangat jarang). Dalam hal ini, pasti benar!
Andras Zoltan
5
4xx menunjukkan kesalahan oleh klien yang dapat diperbaiki oleh mereka mengambil tindakan tertentu, sedangkan 5xx menunjukkan masalah pada server yang klien tidak dapat membantu menyelesaikannya. Jadi dalam kasus Anda, 4xx lebih tepat, karena (i) server berperilaku tepat sebagaimana mestinya, dan (ii) klien dapat "memperbaiki" kesalahan dengan memperlambat atau membeli lebih banyak kredit. Resolusi yang tepat dapat ditunjukkan dalam tubuh tanggapan 429.
Mike Chamberlain