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?

Mengomentari pertanyaan (3)
Larutan

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

permintaan tidak dapat dipahami oleh server karena kesalahan syntax

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

server tidak dapat atau tidak akan memproses permintaan tersebut karena sesuatu yang dianggap sebuah kesalahan klien

Komentar (11)
  • Gagal validasi: 403 Forbidden ("server memahami permintaan, tetapi menolak untuk memenuhi itu,"). Berlawanan dengan pendapat populer, RFC2616 doesn't mengatakan "403 hanya ditujukan untuk otentikasi gagal", tapi "403: aku tahu apa yang anda inginkan, tetapi saya tidak't melakukan itu". Kondisi itu mungkin atau tidak mungkin karena untuk otentikasi.
  • Mencoba untuk menambahkan duplikat: 409 Konflik ("permintaan tidak dapat diselesaikan karena konflik dengan keadaan saat ini sumber daya.")

Anda pasti harus memberikan penjelasan yang lebih rinci dalam respon header dan/atau tubuh (misalnya dengan custom header - X-Status-Alasan: Validasi gagal).

Komentar (19)

Saya merekomendasikan kode status 422, "Unprocessable Badan".

11.2. 422 Unprocessable Badan

422 (Unprocessable Badan) status kode berarti server memahami isi jenis permintaan badan (karenanya 415(Unsupported Media Type) kode status yang tidak pantas), dan sintaksis permintaan entitas yang benar (dengan demikian 400 (Bad Request) kode status yang tidak pantas) namun tidak mampu memproses terkandung petunjuk. Misalnya, kondisi kesalahan ini dapat terjadi jika XML request tubuh berisi well-formed (yaitu, sintaksis yang benar), tetapi secara semantik yang keliru, XML petunjuk.

Komentar (14)

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:

{
    "errors" :
    { 
        "arg1" : ["error msg 1", "error msg 2", ...]
        "arg2" : ["error msg 1", "error msg 2", ...]
    }
}

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.

Komentar (4)

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/

Komentar (1)

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:

  • URI adalah salah (HTTP)
  • Tidak ada pengguna yang ditemukan (ISTIRAHAT)

"403 Forbidden/Akses Ditolak" dapat berarti:

  • Izin khusus yang dibutuhkan. Browser bisa mengatasinya dengan meminta user/password. (HTTP)
  • Salah izin akses dikonfigurasi pada server. (HTTP)
  • Anda perlu dikonfirmasi (ISTIRAHAT)

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:

  • "kesalahan" objek JSON hasilnya jika sesuatu yang tidak beres
  • Kosong JSON array/objek jika tidak ada record ditemukan
  • Bool hasil/sukses bendera dalam kombinasi dengan opsi sebelumnya untuk penanganan yang lebih baik.

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:

Pada bulan juli 2004, INGGRIS penyedia telekomunikasi BT Grup dikerahkan Cleanfeed pemblokiran konten sistem, yang mengembalikan 404 error untuk setiap permintaan untuk konten yang diidentifikasi berpotensi ilegal oleh Internet Watch Yayasan. Lainnya Isp mengembalikan HTTP 403 "dilarang" kesalahan yang sama keadaan. Praktek mempekerjakan palsu 404 kesalahan sebagai sarana untuk menyembunyikan sensor juga telah dilaporkan di Thailand dan Tunisia. Di Tunisia, di mana sensor parah sebelum revolusi 2011, orang-orang menjadi sadar dari sifat palsu 404 kesalahan dan dibuat imajiner karakter bernama "Ammar 404" yang merupakan "tak terlihat menyensor".

Mengapa tidak hanya menjawab dengan sesuatu seperti ini?

{
  "result": false,
  "error": {"code": 102, "message": "Validation failed: Wrong NAME."}
}

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.

Komentar (9)

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.

Komentar (0)

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 dan Content-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.

Komentar (1)