Apa kode status HTTP yang tepat untuk dikembalikan oleh layanan REST API untuk kegagalan validasi?

394

Saat ini saya mengembalikan 401 Tidak Sah setiap kali saya mengalami kegagalan validasi dalam aplikasi REST API berbasis Django / Piston saya . Setelah melihat Registry Status Status HTTP, saya tidak yakin bahwa ini adalah kode yang sesuai untuk kegagalan validasi, apa yang Anda rekomendasikan?

  • 400 permintaan Buruk
  • 401 Tidak Resmi
  • 403 Dilarang
  • 405 Metode Tidak Diizinkan
  • 406 Tidak Dapat Diterima
  • 412 Prasyarat Gagal
  • 417 Harapan Gagal
  • 422 Entitas yang Tidak Dapat Diproses
  • 424 Dependensi Gagal

Pembaruan : "Kegagalan validasi" di atas berarti kegagalan validasi data tingkat aplikasi, mis., Waktu data yang ditentukan salah, alamat email palsu dll.

michaeljoseph
sumber
2
Lihatlah jawaban ini: stackoverflow.com/a/2657624/221612
Kenny Meyer
3
Fwiw, tautan Kenny menyarankan kode 422, seperti jawaban Jim sekarang di bawah . #TheMoreYouKnow #SavingYouAClick
ruffin
Saya pikir 401 lebih jelas.
lambang

Jawaban:

298

Jika "kegagalan validasi" berarti ada beberapa kesalahan klien dalam permintaan, maka gunakan HTTP 400 (Permintaan Buruk). Misalnya jika URI seharusnya memiliki tanggal ISO-8601 dan Anda menemukan bahwa itu dalam format yang salah atau mengacu pada 31 Februari, maka Anda akan mengembalikan HTTP 400. Ditto jika Anda mengharapkan XML yang terbentuk dengan baik dalam badan entitas dan gagal mem-parsing.

(1/2016): Selama lima tahun terakhir, HTTP 422 (Unprocessable Entity) WebDAV yang lebih spesifik telah menjadi alternatif yang sangat masuk akal untuk HTTP 400. Lihat misalnya penggunaannya dalam JSON API . Tetapi harap dicatat bahwa HTTP 422 belum membuatnya menjadi HTTP 1.1, RFC-7231 .

Richardson dan Ruby RESTful Web Services berisi lampiran yang sangat membantu tentang kapan harus menggunakan berbagai kode respons HTTP. Mereka bilang:

400 ("Permintaan Buruk")
Pentingnya: Tinggi.
Ini adalah status kesalahan sisi klien umum, digunakan ketika tidak ada kode kesalahan 4xx lain yang sesuai. Ini biasanya digunakan ketika klien mengirimkan representasi bersama dengan permintaan PUT atau POST, dan representasi tersebut dalam format yang benar, tetapi itu tidak masuk akal. (hal. 381)

dan:

401 ("Tidak Sah")
Pentingnya: Tinggi.
Klien mencoba untuk beroperasi pada sumber daya yang dilindungi tanpa memberikan kredensial otentikasi yang tepat. Mungkin memberikan kredensial yang salah, atau tidak sama sekali. Kredensial dapat berupa nama pengguna dan kata sandi, kunci API, atau token autentikasi — apa pun layanan yang diharapkan. Sudah umum bagi klien untuk membuat permintaan untuk URI dan menerima 401 hanya supaya tahu kredensial macam apa yang akan dikirim dan dalam format apa. [...]

Jim Ferrans
sumber
3
Tetapi mungkin jika format URI tidak valid, 404 mungkin lebih sesuai.
manu
11
Seperti yang dinyatakan oleh @ReWrite, saya juga berpikir 422 lebih baik untuk kesalahan validasi.
panteo
11
Saya akan mengatakan ini salah. 400 Bad Request digunakan ketika secara sintaksis ada yang salah dengan permintaan tersebut. Saya akan mengatakan ReWrite benar dalam merekomendasikan 422 yaitu tentang isi permintaan.
Stijn de Witt
3
@ Kenji ya, 401 ("Tidak Sah"): "Ini mungkin memberikan kredensial yang salah ..." berarti pengguna dan / atau kata sandi salah.
razzintown
4
@JimFerrans 400 galat adalah karena sintaks yang diberikan salah. 401 kesalahan secara khusus jika saya mencoba mengakses halaman yang harus saya akses untuk mengakses dan saya tidak masuk sama sekali. 422 kesalahan adalah untuk di mana sintaks sudah benar, tetapi server menolak layanan. Nama pengguna / kata sandi salah adalah sintaks yang benar (bukan 400 kesalahan) dan saya tidak mencoba mengakses halaman yang saya harus masuk karena saya mengakses halaman login itu sendiri (bukan 401 kesalahan). Kesalahan 401 harus digunakan untuk sesuatu seperti halaman pengaturan yang hanya dapat diakses oleh pengguna
Zachary Weixelbaum
98

Dari RFC 4918 (dan juga didokumentasikan di http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml ):

Kode status 422 (Entitas yang Tidak Dapat Diproses) berarti server memahami jenis konten entitas permintaan (oleh karena itu kode status 415 (Jenis Media yang Tidak Didukung) tidak pantas), dan sintaks entitas permintaan benar (dengan demikian 400 (Permintaan Buruk) ) kode status tidak pantas) tetapi tidak dapat memproses instruksi yang terkandung. Sebagai contoh, kondisi kesalahan ini dapat terjadi jika badan permintaan XML berisi formulasi XML yang baik (yaitu, benar secara sintaksis), tetapi secara semestinya salah.

Menulis kembali
sumber
6
Saya akan merekomendasikan 422 - Entitas yang tidak dapat diproses untuk kegagalan validasi lebih dari 400 - Permintaan Buruk
java_geek
19

Ini dia:

rfc2616 # section-10.4.1 - 400 Permintaan Buruk

Permintaan tidak dapat dipahami oleh server karena sintaksis yang salah . Klien TIDAK HARUS mengulangi permintaan tanpa modifikasi.

rfc7231 # section-6.5.1 - 6.5.1. 400 permintaan Buruk

Kode status 400 (Permintaan Buruk) menunjukkan bahwa server tidak dapat atau tidak akan memproses permintaan karena sesuatu yang dianggap sebagai kesalahan klien (misalnya, sintaks permintaan salah bentuk, pembingkaian pesan permintaan tidak valid, atau perutean permintaan yang menipu) .

Mengacu pada kasus yang cacat (tidak berbentuk baik)!

rfc4918 - 11.2. 422 Entitas yang Tidak Dapat Diproses

Kode status 422 (Entitas yang Tidak Dapat Diproses) berarti server
memahami jenis konten entitas permintaan (oleh karena itu kode status 415 (Jenis Media yang Tidak Didukung) tidak pantas), dan sintaks entitas permintaan benar (dengan demikian 400 (Permintaan Buruk) ) kode status tidak pantas) tetapi tidak dapat memproses instruksi yang terkandung. Misalnya, kondisi kesalahan ini dapat terjadi jika badan permintaan XML berisi formulasi XML yang baik (yaitu, benar secara sintaksis), tetapi secara semestinya salah .

Kesimpulan

Rule of thumb: [_] 00 mencakup kasus dan kasus yang paling umum yang tidak dicakup oleh kode yang ditentukan.

422 cocok dengan kesalahan validasi objek terbaik (tepatnya rekomendasi saya :)
Adapun kesalahan semantik - Pikirkan sesuatu seperti "Nama pengguna ini sudah ada" validasi.

400 salah digunakan untuk validasi objek

honzajde
sumber
9

Saya akan mengatakan secara teknis itu mungkin bukan kegagalan HTTP, karena sumber daya itu (mungkin) ditentukan secara sah, pengguna diautentikasi, dan tidak ada kegagalan operasional (namun bahkan spek itu menyertakan beberapa kode cadangan seperti 402 Dibutuhkan Pembayaran yang diperlukan ' t secara tegas terkait dengan HTTP, meskipun mungkin disarankan untuk menggunakannya pada tingkat protokol sehingga perangkat apa pun dapat mengenali kondisinya).

Jika memang demikian, saya akan menambahkan bidang status ke respons dengan kesalahan aplikasi, seperti

<status><code>4</code> <message> Rentang tanggal tidak valid </message> </status>

jspcal
sumber
1

Ada sedikit lebih banyak informasi tentang semantik kesalahan ini di RFC 2616 , yang mendokumentasikan HTTP 1.1.

Secara pribadi, saya mungkin akan menggunakan 400 Bad Request, tetapi ini hanya pendapat pribadi saya tanpa dukungan faktual.

andri
sumber
0

Apa sebenarnya yang Anda maksud dengan "kegagalan validasi"? Apa yang Anda validasi? Apakah Anda merujuk pada sesuatu seperti kesalahan sintaksis (mis. XML cacat)?

Jika itu masalahnya, saya akan mengatakan 400 Permintaan Buruk mungkin adalah hal yang benar, tetapi tanpa mengetahui apa yang Anda "validasikan", tidak mungkin untuk mengatakannya.

Nicholas Knight
sumber
bagaimana jika kita mencoba memvalidasi beberapa validasi atau aturan bisnis.
Metalhead