Saya sedang membangun aplikasi dengan API berbasis REST dan telah sampai pada titik di mana saya menentukan kode status untuk setiap permintaan.
Kode status apa yang harus saya kirim untuk permintaan yang gagal validasi atau di mana permintaan mencoba untuk menambahkan duplikat di database saya?
Saya telah melihat melalui http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html tetapi tidak satupun dari mereka tampaknya benar.
Apakah ada praktik umum saat mengirim kode status?
http
rest
http-status-codes
Alex
sumber
sumber
Jawaban:
Untuk kegagalan validasi input: 400 Permintaan Buruk + deskripsi opsional Anda. Ini disarankan dalam buku " RESTful Web Services ". Untuk pengiriman ganda: 409 Konflik
Perbarui Juni 2014
Spesifikasi yang relevan dulu RFC2616 , yang memberikan penggunaan 400 (Permintaan Buruk) agak sempit
Jadi bisa dikatakan bahwa itu tidak pantas untuk kesalahan semantik. Tapi tidak lagi; sejak Juni 2014, standar RFC 7231 yang relevan , yang menggantikan RFC2616 sebelumnya, memberikan penggunaan 400 (Permintaan Buruk) lebih luas sebagai
sumber
something perceived to be a client error
, semua contoh yang diberikan dalam paragraf ini adalah pelanggaran protokol HTTP, bukan kesalahan logis: sintaks, framing, routing. Jadi, saya menganggap bahwa spesifikasi HTTP tidak mengizinkan 400 untuk validasi gagal pada level aplikasi.Anda harus memberikan penjelasan yang lebih rinci dalam tajuk dan / atau badan tanggapan (mis. Dengan tajuk khusus -
X-Status-Reason: Validation failed
).sumber
HTTP/1.0 403 Form validation errors
adalah cara yang paling bersih.Saya merekomendasikan kode status 422, "Entitas yang tidak dapat diproses" .
sumber
200.300, 400, 500 semuanya sangat generik. Jika Anda ingin generik, 400 tidak apa-apa.
422 digunakan oleh semakin banyak API, dan bahkan digunakan oleh Rails di luar kotak.
Tidak peduli kode status mana yang Anda pilih untuk API Anda, seseorang akan tidak setuju. Tapi saya lebih suka 422 karena saya menganggap '400 + status teks' sebagai terlalu umum. Selain itu, Anda tidak memanfaatkan parser JSON-ready; sebaliknya, 422 dengan respons JSON sangat eksplisit, dan banyak informasi kesalahan dapat disampaikan.
Berbicara tentang respons JSON, saya cenderung untuk membakukan pada respons kesalahan Rails untuk kasus ini, yaitu:
Format ini sempurna untuk validasi formulir, yang saya anggap sebagai kasus paling rumit untuk didukung dalam hal 'kekayaan pelaporan kesalahan'. Jika struktur kesalahan Anda adalah ini, kemungkinan akan menangani semua kebutuhan pelaporan kesalahan Anda.
sumber
arg1
valid danarg2
valid, tetapi kombinasi keduanya, dengan nilai spesifik yang dikirim, tidak valid.200
Ugh ... (309, 400, 403, 409, 415, 422) ... banyak jawaban yang mencoba menerka, memperdebatkan dan membakukan apa kode pengembalian terbaik untuk permintaan HTTP yang berhasil tetapi panggilan REST gagal. .
Adalah salah untuk mencampur kode status HTTP dan kode status REST.
Namun, saya melihat banyak implementasi yang memadukannya, dan banyak pengembang mungkin tidak setuju dengan saya.
Kode pengembalian HTTP terkait dengan
HTTP Request
itu sendiri. Panggilan REST dilakukan menggunakan permintaan Hypertext Transfer Protocol dan berfungsi pada tingkat yang lebih rendah daripada metode REST yang dipanggil itu sendiri. REST adalah konsep / pendekatan, dan outputnya adalah hasil bisnis / logis , sedangkan kode hasil HTTP adalah transportasi .Misalnya, mengembalikan "404 Tidak ditemukan" ketika Anda memanggil / pengguna / bingung, karena itu dapat berarti:
"403 Dilarang / Akses Ditolak" dapat berarti:
Dan daftar tersebut dapat berlanjut dengan '500 Server error "(kesalahan Apache / Nginx HTTP dilemparkan atau kesalahan kendala bisnis di REST) atau kesalahan HTTP lainnya dll ...
Dari kode, sulit untuk memahami apa yang menjadi alasan kegagalan, kegagalan HTTP (transportasi) atau kegagalan REST (logis).
Jika permintaan HTTP berhasil dilakukan secara fisik, ia harus selalu mengembalikan 200 kode, terlepas dari apakah catatan ditemukan atau tidak. Karena sumber daya URI ditemukan dan ditangani oleh server HTTP. Ya, itu mungkin mengembalikan set kosong. Apakah mungkin untuk menerima halaman web kosong dengan 200 sebagai hasil HTTP, kan?
Alih-alih ini, Anda dapat mengembalikan 200 kode HTTP dengan beberapa opsi:
Juga, beberapa penyedia internet dapat mencegat permintaan Anda dan mengembalikan Anda kode HTTP 404. Ini tidak berarti bahwa data Anda tidak ditemukan, tetapi ada sesuatu yang salah pada tingkat transportasi.
Dari Wiki :
Kenapa tidak jawab saja dengan sesuatu seperti ini?
Google selalu mengembalikan 200 sebagai kode status di Geocoding API mereka, meskipun permintaan gagal secara logis: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
Facebook selalu mengembalikan 200 untuk permintaan HTTP yang berhasil, bahkan jika permintaan REST gagal: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling
Sederhana, kode status HTTP adalah untuk permintaan HTTP. REST API adalah milik Anda, tentukan kode status Anda.
sumber
BadRequest()
Metode .NET memiliki model pengembalian sendiri yang akan berbeda dari model pengembalian reguler Anda. Itu mimpi buruk untuk diurai. @KevinHooke, mengembalikan HTTP 200 untuk kesalahan validasi REST seperti mengatakan, "Saya menerima pesan Anda, jawabannya tidak, dan inilah sebabnya." Mengembalikan HTTP 400 mengatakan, "Saya tidak tahu apa yang Anda bicarakan."Duplikat dalam database harus a
409 CONFLICT
.Saya sarankan menggunakan
422 UNPROCESSABLE ENTITY
untuk kesalahan validasi.Saya memberikan penjelasan lebih lama tentang kode 4xx di sini .
sumber
Kode Status 304 Tidak Dimodifikasi juga akan membuat respons yang dapat diterima untuk permintaan duplikat. Ini mirip dengan memproses tajuk
If-None-Match
menggunakan tag entitas.Menurut pendapat saya, jawaban @ Piskvor adalah pilihan yang lebih jelas untuk apa yang saya rasakan adalah maksud dari pertanyaan awal, tetapi saya memiliki alternatif yang juga relevan.
Jika Anda ingin memperlakukan permintaan duplikat sebagai peringatan atau pemberitahuan alih-alih sebagai kesalahan, kode status respons
304
Tidak Dimodifikasi danContent-Location
tajuk yang mengidentifikasi sumber daya yang ada akan sama validnya. Ketika tujuannya hanya untuk memastikan bahwa ada sumber daya, permintaan duplikat tidak akan menjadi kesalahan tetapi konfirmasi. Permintaannya tidak salah, tetapi hanya berlebihan, dan klien dapat merujuk ke sumber daya yang ada.Dengan kata lain, permintaan itu baik, tetapi karena sumber daya sudah ada, server tidak perlu melakukan pemrosesan lebih lanjut.
sumber
Adaptor ActiveRecord Ember-Data berharap
422 UNPROCESSABLE ENTITY
untuk dikembalikan dari server. Jadi, jika klien Anda ditulis dalam Ember.js, Anda harus menggunakan 422. Hanya kemudian DS.Errors akan diisi dengan kesalahan yang dikembalikan. Tentu saja Anda dapat mengubah 422 ke kode lain di adaptor Anda.sumber
406 - Tidak Dapat Diterima
Yang berarti respons ini dikirim ketika server web, setelah melakukan negosiasi konten berbasis server, tidak menemukan konten yang sesuai dengan kriteria yang diberikan oleh agen pengguna.
sumber