Saya sedikit di persimpangan jalan dengan beberapa desain API untuk klien (JS di browser) untuk berbicara dengan server. Kami menggunakan Konflik HTTP 409 untuk mewakili kegagalan tindakan karena kunci pengaman berlaku. Kunci satefy mencegah devs membuat perubahan secara tidak sengaja dalam sistem produksi pelanggan kami. Saya telah ditugaskan menangani 409s sedikit lebih anggun pada klien untuk menunjukkan mengapa panggilan API tertentu gagal.
Solusi saya adalah untuk membungkus penangan kegagalan dari setiap panggilan AJAX kami yang akan menampilkan pemberitahuan pada klien ketika sesuatu gagal karena 409 - ini semua baik-baik saja dan bekerja dengan baik bersama kesalahan 4XX dan 5XX lainnya yang menggunakan mekanisme yang sama.
Masalah telah muncul ketika salah satu penangan rute kami merespons dengan 409 ketika menemukan kesalahan logika bisnis - pembungkus AJAX saya melaporkan bahwa kunci pengaman aktif, sementara penangan kegagalan klien yang ada melaporkan apa (yang menurutnya) masalah berdasarkan pada tubuh tanggapan. Solusi sederhana adalah mengubah respons pawang atau kode status yang kami gunakan untuk mewakili kunci pengaman.
Yang membawa saya ke persimpangan jalan: haruskah kode status HTTP bahkan digunakan untuk mewakili kesalahan logika bisnis? Pertanyaan ini membahas masalah yang sama yang saya hadapi tetapi tidak mendapatkan banyak daya tarik. Seperti yang disarankan dalam jawaban yang ditautkan, saya condong ke arah menggunakan HTTP 200 OK dengan badan yang sesuai untuk mewakili kegagalan dalam logika bisnis.
Adakah yang punya pendapat kuat di sini? Adakah yang bisa meyakinkan saya bahwa ini adalah cara yang salah untuk menggambarkan kegagalan?
400 Bad Request
. Alasan pemisahan ini adalah karena sistem di masa depan, pengembang atau pembaca dokumen mungkin bingung dengan penyimpangan Anda dari standar di seluruh dunia.400 Bad Request
sebagai selimut, kode HTTP tampaknya paling baik untuk menutupi kesalahan logika bisnis sebagai kelas.400 Bad Request
ketika data hilang atau tidak dapat dibaca / diuraikan. Yaitu data permintaan itu sendiri buruk dalam beberapa hal.Jawaban:
Kasey mencakup poin utama.
Gagasan kunci dalam api web apa pun: Anda mengadaptasi domain Anda agar terlihat seperti penyimpanan dokumen. DAPATKAN / PUT / POST / HAPUS dan sebagainya adalah semua cara berinteraksi dengan penyimpanan dokumen.
Jadi suatu cara berpikir tentang apa kode untuk digunakan, adalah untuk memahami apa operasi analog adalah di toko dokumen, dan apa kegagalan ini akan terlihat seperti di analog itu.
2xx sama sekali tidak cocok
5xx juga tidak cocok
Dalam hal ini, server tidak melakukan kesalahan; sadar bahwa Anda tidak seharusnya mengubah sumber daya itu seperti itu saat ini.
Kesalahan logika bisnis (artinya invarian bisnis tidak mengizinkan pengeditan yang diusulkan saat ini) mungkin 409
Catat bit terakhir ini - muatan respons 409 harus mengkomunikasikan informasi kepada konsumen tentang apa yang salah, dan idealnya mencakup kontrol hypermedia yang mengarahkan konsumen ke sumber daya yang dapat membantu menyelesaikan konflik.
Dan saya akan menunjuk ini sebagai masalah; implementasi Anda di klien mengasumsikan bahwa kode status sudah cukup untuk mendefinisikan masalah. Alih-alih, kode klien Anda harus meninjau muatan, dan bertindak berdasarkan informasi yang tersedia di sana.
Lagi pula, bagaimana sebuah toko dokumen akan melakukannya
Pendekatan yang sama dengan a
400 Bad Request
juga dapat diterima; yang kira-kira "diterjemahkan menjadi" Ada masalah dengan permintaan Anda. Kami tidak dapat diganggu untuk mencari tahu kode status mana yang paling cocok, jadi begini. Lihat payload untuk detailnya. "Spesifikasi WebDAV mencakup rekomendasi ini
Saya tidak percaya itu cukup cocok (walaupun saya setuju bahwa itu menghilangkan keraguan
400
sebagai alternatif). Interpretasi saya adalah itu422
berarti "Anda telah mengirim entitas yang salah" di mana409
"Anda mengirim entitas pada waktu yang salah".Dengan kata lain,
422
menunjukkan masalah dengan pesan permintaan dipertimbangkan secara terpisah, di mana409
menunjukkan bahwa pesan permintaan bertentangan dengan keadaan sumber daya saat ini.Diskusi Ben Nadal tentang 422 mungkin berguna untuk dipertimbangkan.
sumber
Dalam pengalaman saya, kode kesalahan HTTP tidak cukup untuk mewakili kesalahan bisnis. Namun, mereka berguna untuk mewakili kelas kesalahan.
Jadi, rekomendasi saya adalah menggunakan kode kesalahan HTTP untuk kategori kesalahan, tetapi pilih kesalahan spesifik untuk kegagalan logika bisnis (mis. 409 Konflik ... 200 OK akan menyesatkan di sini) dan memasukkan data dalam respons yang mengindikasikan kesalahan bisnis tertentu . Pastikan ini adalah bagian dari konten respons dan bukan teks status karena beberapa browser mengabaikan teks status kustom. Bahasa yang saya ingin gunakan memiliki Jenis Union yang nyaman untuk mewakili pesan. Tapi Anda juga bisa mendefinisikan konstanta string untuk kasus kesalahan.
Contohnya
sumber
Secara umum, saya akan menghindari menggunakan kode status HTTP untuk mewakili kesalahan logika bisnis tertentu . Ini karena mereka sudah memiliki makna semantik yang didefinisikan oleh standar di seluruh dunia. Sistem lain, pengembang baru dan seterusnya akan bingung oleh penyimpangan standar Anda.
Apa yang saya temukan dalam penelitian baru-baru ini, serupa, adalah bahwa itu secara umum diterima untuk digunakan
400 Bad Request
dalam kasus kesalahan validasi dan semacamnya. Dengan cara ini, Anda menggunakan satu kode status untuk semua kesalahan logika bisnis.Secara kebetulan,
409
harus digunakan ketika sumber daya telah berubah saat Anda mengeditnya dan mencoba menyimpannya lagi.sumber
Anda dapat menggunakan "Permintaan Buruk" dan menyertakan id aturan bisnis yang dilanggar plus beberapa detail lainnya di badan respons.
sumber