Lebih
SISANYA kode status HTTP untuk gagal validasi atau tidak valid duplikat
I'm membangun sebuah aplikasi dengan SISA berbasis API dan telah datang ke titik di mana saya'm menentukan status kode untuk setiap permintaan.
Apa status kode yang harus saya kirim untuk permintaan gagal validasi atau di mana permintaan adalah mencoba untuk menambahkan duplikat di database saya?
I've melihat melalui http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html tapi tidak satupun dari mereka tampaknya benar.
Apakah ada praktek umum ketika mengirim kode status?
778
8
Untuk validasi input kegagalan: 400 Bad Request + opsional anda keterangan. Ini adalah yang disarankan dalam buku "RESTful Web Services". Untuk ganda kirim: 409 Konflik
Update Juni 2014
Spesifikasi relevan digunakan untuk menjadi RFC2616, yang memberikan penggunaan 400 (Bad Request) agak sempit
Sehingga might telah berpendapat bahwa hal itu tidak pantas untuk kesalahan semantik. Tapi tidak lagi, sejak juni 2014 standar yang relevan RFC 7231, yang menggantikan sebelumnya RFC2616, memberikan penggunaan 400 (Bad Request) secara lebih luas sebagai
Anda pasti harus memberikan penjelasan yang lebih rinci dalam respon header dan/atau tubuh (misalnya dengan custom header -
X-Status-Alasan: Validasi gagal
).Saya merekomendasikan kode status 422, "Unprocessable Badan".
200,300, 400, 500 semua sangat generik. Jika anda ingin generik, 400 lebih OK.
422 digunakan oleh peningkatan jumlah Api, dan bahkan digunakan oleh Rel out of the box.
Tidak peduli di mana kode status anda memilih untuk API, seseorang akan tidak setuju. Tapi aku lebih suka 422 karena saya pikir dari '400 + teks status' terlalu generik. Juga, anda tidak't mengambil keuntungan dari JSON-siap parser; sebaliknya, 422 dengan respon JSON sangat eksplisit, dan banyak kesalahan informasi yang dapat disampaikan.
Berbicara tentang respon JSON, saya cenderung untuk membakukan pada Rel kesalahan respon untuk kasus ini, yaitu:
Format ini sangat cocok untuk validasi form, yang saya anggap paling kompleks kasus untuk mendukung dalam hal 'kesalahan pelaporan kekayaan'. Jika anda kesalahan struktur ini, kemungkinan akan menangani semua kesalahan pelaporan kebutuhan.
Duplikat dalam database harus menjadi
409 KONFLIK
.Saya sarankan menggunakan
422 UNPROCESSABLE BADAN
untuk kesalahan validasi.Saya memberikan penjelasan yang lebih tentang 4xx kode berikut: http://parker0phil.com/2014/10/16/REST_http_4xx_status_codes_syntax_and_sematics/
200
Ugh... (309, 400, 403, 409, 415, 422)... banyak jawaban yang mencoba untuk menebak, berpendapat dan membakukan apa yang terbaik kembali kode untuk a sukses permintaan HTTP tapi gagal SISA panggilan.
Itu adalah salah untuk campur kode status HTTP dan SISANYA kode status.
Namun, saya melihat banyak implementasi pencampuran mereka, dan banyak pengembang yang mungkin tidak setuju dengan saya.
HTTP kembali kode yang terkait dengan
HTTP Request
itu sendiri. ISTIRAHAT panggilan ini dilakukan dengan menggunakan Hypertext Transfer Protocol permintaan dan bekerja pada tingkat yang lebih rendah daripada dipanggil SISANYA metode itu sendiri. SISANYA adalah konsep/pendekatan, dan output-nya adalah bisnis/logis hasil, sementara hasil HTTP code adalah transportasi salah satu.Misalnya, kembali "404 Tidak ditemukan" ketika anda call /pengguna/ lebih membingungkan, karena hal ini dapat berarti:
"403 Forbidden/Akses Ditolak" dapat berarti:
Dan daftar dapat melanjutkan dengan '500 Server error" (Apache/Nginx HTTP dilemparkan kesalahan atau kendala kesalahan di SISA) atau lainnya HTTP kesalahan dll...
Dari kode itu,'s sulit untuk memahami apa yang menjadi alasan kegagalan, HTTP (transportasi) kegagalan atau ISTIRAHAT (logis) kegagalan.
Jika permintaan HTTP yang secara fisik telah berhasil dilakukan itu harus: selalu kembali 200 kode, terlepas adalah catatan(s) ditemukan atau tidak. Karena URI sumber daya menyenangkan dan ditangani oleh server HTTP. Ya, itu mungkin kembali sebuah himpunan kosong. Adalah mungkin untuk menerima kosong halaman web dengan 200 sebagai HTTP hasilnya, kan?
Bukannya ini anda dapat kembali 200 HTTP code dengan beberapa pilihan:
Juga, beberapa penyedia layanan internet mungkin mencegat permintaan anda dan kembali anda HTTP 404 kode. Ini tidak berarti bahwa data tidak ditemukan, tapi itu's sesuatu yang salah pada tingkat transportasi.
Dari Wiki:
Mengapa tidak hanya menjawab dengan sesuatu seperti ini?
Google selalu kembali 200 sebagai kode status mereka Geocoding API, bahkan jika permintaan logis gagal: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
Facebook selalu kembali 200 untuk sukses permintaan HTTP, bahkan jika SISA permintaan gagal: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling
It's sederhana, kode status HTTP yang untuk permintaan HTTP. REST API Anda, tentukan kode status.
Ember-Data's ActiveRecord adaptor mengharapkan
422 UNPROCESSABLE ENTITAS
yang akan dikembalikan dari server. Jadi, jika anda're klien yang ditulis dalam Ember.js anda harus menggunakan 422. Hanya kemudian DS.Kesalahan akan diisi dengan kembali kesalahan. Tentu saja anda dapat mengubah 422 untuk kode lainnya pada adaptor anda.Kode Status 304 Not Modified juga akan membuat aplikasi yang dapat diterima menanggapi permintaan duplikat. Hal ini mirip dengan pengolahan header
If-None-Match
menggunakan suatu entitas tag.Dalam pendapat saya, @Piskvor's jawaban adalah pilihan yang jelas untuk apa yang saya rasakan adalah maksud dari pertanyaan awal, tapi saya memiliki alternatif lain yang juga relevan.
Jika anda ingin mengobati duplikat permintaan sebagai peringatan atau pemberitahuan daripada sebagai sebuah kesalahan, kode status respon dari
304
Tidak Dimodifikasi danContent-Location
header mengidentifikasi sumber daya yang ada akan menjadi seperti yang berlaku. Ketika tujuannya adalah hanya untuk memastikan bahwa sumber daya yang ada, duplikat permintaan tidak akan menjadi sebuah kesalahan tapi konfirmasi. Permintaan ini tidak salah, tetapi hanya berlebihan, dan klien dapat merujuk ke sumber daya yang ada.Dengan kata lain, permintaan yang baik, tapi karena sumber daya yang sudah ada, server tidak perlu melakukan pengolahan lebih lanjut.