Saya merancang REST API untuk proyek di mana pengguna selalu menggunakan salah satu dari beberapa "paket" - setiap paket menentukan beberapa batasan sumber daya, seperti jumlah maksimal pengguna yang mungkin dimiliki akun atau jumlah maksimum data yang dapat mereka unggah. Setelah salah satu dari batasan ini tercapai, pengguna dapat meningkatkan rencana mereka (pada dasarnya membayar) untuk mendapatkan lebih banyak sumber daya.
Saya ingin mengembalikan kode status khusus yang menunjukkan situasi di mana tindakan tidak dapat dilakukan karena batas sumber daya akun, dan memutakhirkan paket akan menyelesaikan ini - misalnya jika pengguna menggunakan 100% dari kapasitas penyimpanan mereka dan mencoba mengunggah file tambahan , mereka akan mendapatkan respons ini.
Para kandidat adalah, IMHO:
403 Forbidden
- Namun, saya ingin membedakan antara kasus ini dan kasus-kasus lain di mana pengguna tidak memiliki izin untuk melakukan tindakan ini.401 Unauthorized
- bukan ide yang baik, kami menggunakan ini untuk masalah terkait otentikasi.402 Payment Required
- masuk akal tapi saya khawatir menggunakan kode status yang non-standar namun dicadangkanSesuatu yang bahkan kurang standar seperti
423 Locked
tidak mungkin kita akan menggunakannya untuk hal lain di masa depan
Pilihan lain adalah menggunakan sesuatu yang sangat standar seperti 403
tetapi menunjukkan kekhasan kesalahan dalam badan tanggapan.
Saya ingin tahu pendekatan mana yang Anda yakini akan (a) bekerja paling baik dalam jangka panjang dan (b) akan lebih baik berpegang pada prinsip RESTful.
sumber
Jawaban:
Saya pikir 403 adalah satu-satunya respons yang masuk akal, meskipun 405 Metode Tidak Diizinkan atau 409 Konflik mungkin dapat diterima, saya tidak berpikir keduanya sebagus 403 yang menyatakan:
Jika Anda mengembalikan kesalahan 403, itu akan mencakup beberapa informasi tentang mengapa sumber daya ditolak - izin yang tidak valid hanyalah kasus yang paling umum, melampaui batas tidak jauh berbeda - Anda tidak memiliki izin karena batas Anda terlampaui.
sumber
Saya percaya 403 salah, karena 403 adalah untuk situasi di mana Anda tidak mendapatkan akses ke sumber daya, dan tidak ada cara apa pun untuk mendapatkan akses. Untuk pelanggan Anda, jelas ada cara untuk mendapatkan akses: Membayar.
401 benar-benar salah, karena Anda tidak hanya menggunakannya untuk otentikasi, tetapi untuk itulah ia ada.
Karena Anda menulis API, saya berasumsi bahwa orang lain harus menulis kode yang menggunakan API, dan orang itu perlu membaca spesifikasi API Anda. Anda mungkin menggunakan 429 "Terlalu banyak permintaan". Ini biasanya dimaksudkan untuk membatasi tingkat (di mana klien dapat membuat 100 permintaan per hari, misalnya), tetapi berlaku secara wajar untuk situasi Anda. 402 (Dibutuhkan pembayaran) juga bisa diterima, saya pikir. Tergantung pada alat apa yang Anda harapkan orang untuk menggunakan API Anda. 429 memiliki risiko bahwa alat pintar mencoba mengirim lebih sedikit permintaan per menit / jam / hari dan tidak pernah berhasil.
BTW menurut https://tools.ietf.org/html/rfc6585 kesalahan 429 juga harus berisi pesan html yang menggambarkan sifat masalah, jadi ada kemungkinan besar bahwa pengguna benar-benar diberi tahu apa masalahnya, jika Anda menyediakan informasi itu dalam respons Anda.
sumber
402
adalah pilihan, tetapi saya lebih memilih untuk memesan429
untuk keperluan pembatasan tingkat aktual yang kemungkinan akan kita tambahkan di masa depan403
meskipun saya suka429
jauh lebih baik. Saya telah melihat beberapa implementasi kustom dari klien http yang melakukan beberapa hal aneh401
dan403
(misalnya situs web akan mengeluarkan pengguna jika pernah mendapatkan 401 atau 403 dari api).WebDAV menggunakan HTTP 507 Insufficient Storage untuk ini dan menyertakan kode kesalahan tambahan untuk kuota yang terlampaui di badan permintaan, untuk membedakannya dari jenis keterbatasan penyimpanan lainnya.
sumber