Saya membuat RESTful API yang akan memproses sejumlah interaksi pengguna, termasuk melakukan pemesanan menggunakan kartu kredit yang tersimpan.
Jika pesanan berhasil, saya mengembalikan 200 OK, dan dalam kasus permintaan pesanan salah format atau tidak valid, saya mengembalikan 400 Permintaan Buruk. Tetapi apa yang harus saya kembalikan jika ada masalah selama pemrosesan pesanan yang sebenarnya?
- Klien POST pesanan ke server untuk sumber daya pengguna. Jika pengguna tidak ada, 404 Not Found dikembalikan.
- Format dan informasi pesanan divalidasi. Jika tidak valid, 400 Permintaan Buruk dikembalikan.
- Pesanan diproses. Jika pesanan berhasil, 201 Dibuat dikembalikan untuk pesanan. Jika terjadi kesalahan yang tidak terduga, 500 Server Error dikembalikan.
Langkah terakhir adalah masalahnya - apa yang harus saya kembalikan jika pesanan tidak selesai karena alasan lain? Skenario yang mungkin termasuk:
- Produk sudah habis terjual
- Batas pesanan maksimum pengguna tercapai
- Kegagalan transaksi kartu kredit (dana tidak mencukupi, dll.)
Sepertinya ini tidak akan sesuai untuk 400 atau 500. Jika ada, saya bisa melihatnya sebagai 400 jika tidak ada kode yang lebih baik - permintaan tidak valid menurut aturan bisnis. Sepertinya tidak akurat.
Edit: Juga ditemukan diskusi yang ada tentang topik yang sama ini. Semua jawaban di sana tampaknya mengarah pada penggunaan kode status untuk jenis pelanggaran ini, dengan beberapa diskusi antara menggunakan 400, 409, atau ekstensi 422.
sumber
Jawaban:
Anda harus menggunakan 400 untuk aturan bisnis. Jangan mengembalikan 2xx jika pesanan tidak diterima. HTTP adalah protokol aplikasi, jangan pernah lupakan itu. Jika Anda mengembalikan 2xx, klien dapat menganggap bahwa pesanan telah diterima, terlepas dari informasi apa pun yang Anda kirim di bagian isi.
Dari Buku Resep Layanan Web RESTful :
Saya akan menyerahkannya kepada Anda untuk memutuskan antara 4xx dan 5xx, tetapi Anda harus menggunakan kode status kesalahan.
sumber
Anda harus menggunakan 4xx untuk kesalahan klien jika klien dapat mengubah permintaan untuk mengatasi kesalahan tersebut. Gunakan 5xx untuk kesalahan server yang tidak dapat diatasi oleh klien.
Produk terjual habis akan menjadi kesalahan server. Klien tidak dapat mengubah permintaan dengan cara tertentu untuk mengatasi kesalahan. Anda dapat beralih ke produk lain tetapi bukankah itu permintaan baru?
Batas pesanan maksimum pengguna tercapai juga merupakan kesalahan server. Tidak ada yang dapat dilakukan klien untuk mengatasi kesalahan itu.
Kegagalan transaksi kartu kredit akan menjadi kesalahan klien. Klien dapat mengirim ulang permintaan dengan metode pembayaran atau nomor kartu kredit yang berbeda untuk mengatasi kesalahan tersebut.
sumber
Jenis kesalahan:
Kode kesalahan:
Server memahami tipe konten dari entitas permintaan (oleh karena itu kode status Jenis Media yang Tidak Didukung 415 tidak sesuai), dan sintaks dari entitas permintaan benar (dengan demikian kode status Permintaan Buruk 400 tidak sesuai) tetapi tidak dapat memproses yang terkandung instruksi.
Misalnya, kondisi kesalahan ini dapat terjadi jika isi permintaan XML berisi instruksi XML yang dibentuk dengan baik (yaitu, benar secara sintaksis), tetapi salah secara semantik, instruksi XML.
https://httpstatuses.com/422
sumber
Saya tahu pertanyaan ini sudah tua, tetapi saya datang dengan pertanyaan yang sama hari ini. Jika pengguna saya kehabisan kredit, kode status apa yang harus dikembalikan REST API saya?
Saya cenderung condong ke arah
402 Payment Required
:Menurut Wikipedia :
Dan memang mereka melakukannya :
sumber
Bagaimana dengan
424 Failed Dependency
? Spesifikasi menggambarkannya sebagai:Tetapi ada juga definisi ini :
Anda dapat memberi tahu klien (atau berpura-pura) bahwa Anda memiliki tindakan internal yang seharusnya membuat pesanan, dan mengurangi saldo, dan bahwa salah satu tindakan tersebut gagal, meskipun untuk alasan yang benar-benar valid, dan itulah mengapa permintaan gagal.
Sejauh yang saya lihat, "tindakan" adalah istilah yang cukup luas, dan dapat digunakan dalam berbagai situasi, termasuk stok tidak mencukupi, kredit tidak mencukupi, atau pesta gudang di malam hari.
Pilihan lain mungkin
422 Unprocessable Entity
:Mencoba meminta item yang stoknya habis, atau saat kredit Anda tidak mencukupi, dapat dianggap sebagai kesalahan pada tingkat semantik.
MozDev mengatakan ini menunjukkan kesalahan di sisi klien, khususnya: Klien tidak boleh mengulangi permintaan ini tanpa modifikasi.
Loopback 4 menggunakan 422 ketika validasi input gagal.
Bisa dibilang, stok yang tidak mencukupi atau malam pesta gudang bisa dianggap status sementara, jadi permintaan bisa dicoba lagi nanti. Situasi itu bisa ditunjukkan dengan
503 Service Unavailable
sumber
Saya tidak berpikir 400 dapat digunakan untuk semua skenario bisnis. Ini dapat digunakan untuk validasi input data dasar. Selain itu, kami mungkin akan kesulitan menyesuaikan logika bisnis lain ke dalam kode kesalahan ini. Kesalahan yang ditangani oleh ini sebagian besar adalah kesalahan waktu desain yang mungkin ditemui pengembang selama pengkodean klien.
Katakanlah semua parameter sudah benar dan katakanlah kita memasukkan nomor akun pengguna ke dalam permintaan.
Jadi permintaan sekarang bukan lagi permintaan yang buruk, server dapat menerima permintaan tersebut. Tetapi sekarang menolak untuk memenuhi permintaan berdasarkan informasi baru yang tersedia yaitu - saldo akun tidak mencukupi.
Saya menyarankan kita harus menggunakan 403 dengan pesan kesalahan yang sesuai dalam skenario tersebut.
Kode kesalahan lain yang mungkin bisa menjadi konflik 409. Tapi itu digunakan dalam skenario di mana sumber daya dalam keadaan konsisten.
sumber
Saya pergi dengan 406
Not Acceptable
.Berikut daftar 4xx:
sumber