Saya mencoba mencari tahu apa kode status yang benar untuk dikembalikan pada skenario yang berbeda dengan API "seperti REST" yang sedang saya kerjakan. Katakanlah saya memiliki titik akhir yang memungkinkan pembelian POST dalam format JSON. Ini terlihat seperti ini:
{
"account_number": 45645511,
"upc": "00490000486",
"price": 1.00,
"tax": 0.08
}
Apa yang harus saya kembalikan jika klien mengirimi saya "sales_tax" (bukan "pajak" yang diharapkan). Saat ini, saya mengembalikan 400. Tapi, saya mulai mempertanyakan diri saya sendiri tentang ini. Haruskah saya benar-benar mengembalikan 422? Maksudku, ini JSON (yang didukung) dan JSON yang valid, hanya saja tidak berisi semua bidang yang diperlukan.
rest
http-status-codes
David S
sumber
sumber
Jawaban:
400 Permintaan Buruk sekarang tampaknya menjadi kode status HTTP / 1.1 terbaik untuk kasus penggunaan Anda.
Pada saat pertanyaan Anda (dan jawaban asli saya), RFC 7231 bukanlah sesuatu; pada titik mana saya keberatan
400 Bad Request
karena RFC 2616 berkata (dengan penekanan pada saya):dan permintaan yang Anda jelaskan adalah JSON yang secara sintaksis valid, terbungkus dalam HTTP yang secara sintaksis valid, dan dengan demikian server tidak memiliki masalah dengan sintaksis permintaan.
Namun seperti yang ditunjukkan oleh Lee Saferite dalam komentar , RFC 7231, yang usang RFC 2616, tidak termasuk batasan itu :
Namun, sebelum itu ulang kata-kata (atau jika Anda ingin berdalih tentang RFC 7231 hanya menjadi standar yang diusulkan saat ini),
422 Unprocessable Entity
sepertinya kode status HTTP tidak salah untuk kasus penggunaan Anda, karena seperti kata pengantar RFC 4918 mengatakan:Dan deskripsi
422
kata:(Perhatikan referensi sintaksis; saya menduga 7231 juga sebagian 4918)
Ini terdengar persis seperti situasi Anda, tetapi kalau-kalau ada keraguan, ia melanjutkan dengan mengatakan:
(Ganti "XML" dengan "JSON" dan saya pikir kami dapat menyetujui itu adalah situasi Anda)
Sekarang, beberapa orang akan keberatan bahwa RFC 4918 adalah tentang "Ekstensi HTTP untuk Web Authorized and Versioning (WebDAV)" dan bahwa Anda (mungkin) tidak melakukan apa pun yang melibatkan WebDAV sehingga tidak boleh menggunakan hal-hal dari itu.
Mengingat pilihan antara menggunakan kode kesalahan dalam standar asli yang secara eksplisit tidak mencakup situasi, dan satu dari ekstensi yang menggambarkan situasi dengan tepat, saya akan memilih yang terakhir.
Lebih jauh, RFC 4918 Bagian 21.4 merujuk pada Registri Kode Status IANA Hypertext Transfer Protocol (HTTP) , di mana 422 dapat ditemukan.
Saya mengusulkan bahwa sangat masuk akal bagi klien HTTP atau server untuk menggunakan kode status apa pun dari registri itu, selama mereka melakukannya dengan benar.
Tetapi pada HTTP / 1.1, RFC 7231 memiliki daya tarik, jadi gunakan saja
400 Bad Request
!sumber
400 Bad Request adalah kode status HTTP yang tepat untuk kasus penggunaan Anda. Kode ini didefinisikan oleh HTTP / 0.9-1.1 RFC.
http://tools.ietf.org/html/rfc2616#section-10.4.1
422 Entitas yang tidak dapat diproses didefinisikan oleh RFC 4918 - WebDav. Perhatikan bahwa ada sedikit perbedaan dibandingkan dengan 400, lihat kutipan teks di bawah ini.
Untuk menjaga antarmuka yang seragam, Anda harus menggunakan 422 hanya dalam kasus respons XML dan Anda juga harus mendukung semua kode status yang ditentukan oleh ekstensi Webdav, bukan hanya 422.
http://tools.ietf.org/html/rfc4918#page-78
Lihat juga pos Mark Nottingham pada kode status:
Cara Berpikir Tentang Kode Status HTTP
sumber
The following status codes are added to those defined in HTTP/1.1 [RFC2616].
Untuk mencerminkan status pada 2015:
Secara umum kode respons 400 dan 422 akan diperlakukan sama oleh klien dan perantara, sehingga sebenarnya tidak membuat perbedaan nyata yang Anda gunakan.
Namun saya berharap melihat 400 saat ini digunakan secara lebih luas, dan lebih jauh lagi klarifikasi yang disediakan oleh spec HTTPbis menjadikannya lebih sesuai untuk dua kode status:
Untuk konteks, HTTPbis adalah revisi dari spesifikasi HTTP / 1.1 yang mencoba untuk mengklarifikasi area yang tidak jelas atau tidak konsisten. Setelah mencapai status yang disetujui itu akan menggantikan RFC2616.
sumber
Studi kasus: GitHub API
https://developer.github.com/v3/#client-errors
Mungkin menyalin dari API yang terkenal adalah ide yang bijaksana:
sumber
Tidak ada jawaban yang benar, karena itu tergantung pada definisi "sintaks" untuk permintaan Anda. Yang paling penting adalah Anda:
Sebelum semua orang melompati saya karena mengatakan bahwa tidak ada jawaban benar atau salah di sini, izinkan saya menjelaskan sedikit tentang bagaimana saya sampai pada kesimpulan.
Dalam contoh khusus ini, pertanyaan OP adalah tentang permintaan JSON yang berisi kunci berbeda dari yang diharapkan. Sekarang, nama kunci yang diterima sangat mirip, dari sudut pandang bahasa alami, dengan kunci yang diharapkan, tetapi, secara ketat, berbeda, dan karenanya tidak (biasanya) dikenali oleh mesin sebagai setara.
Seperti yang saya katakan di atas, faktor penentu adalah apa yang dimaksud dengan sintaks . Jika permintaan dikirim dengan Tipe Konten
application/json
, maka ya, permintaan tersebut secara sintaksis valid karena itu sintaks JSON yang valid, tetapi tidak secara semantik berlaku, karena tidak sesuai dengan yang diharapkan. (dengan asumsi definisi yang ketat tentang apa yang membuat permintaan tersebut valid secara semantik atau tidak).Jika, di sisi lain, permintaan tersebut dikirim dengan Jenis Konten khusus yang lebih spesifik seperti
application/vnd.mycorp.mydatatype+json
itu, mungkin, menentukan dengan tepat bidang apa yang diharapkan, maka saya akan mengatakan bahwa permintaan tersebut dapat dengan mudah tidak valid secara sintaksis, karenanya tanggapan 400.Dalam kasus yang dimaksud, karena kunci salah, bukan nilainya , ada kesalahan sintaksis jika ada spesifikasi untuk kunci apa yang valid. Jika tidak ada spesifikasi untuk kunci yang valid, atau kesalahan dengan nilai , maka itu akan menjadi kesalahan semantik .
sumber
https://www.keycdn.com/support/422-unprocessable-entity/
sumber
Kasing Anda:
HTTP 400
adalah kode status yang tepat untuk kasing Anda dari perspektif REST karena secara sintaksis salah untuk mengirim,sales_tax
bukantax
JSON yang valid. Ini biasanya ditegakkan oleh sebagian besar kerangka sisi server ketika memetakan JSON ke objek. Namun, ada beberapa implementasi REST yang mengabaikankey
objek JSON baru . Dalam hal itu,content-type
spesifikasi khusus untuk menerima hanya bidang yang valid dapat diberlakukan oleh sisi server.Skenario Ideal untuk 422:
Dalam dunia yang ideal, 422 lebih disukai dan secara umum dapat diterima untuk mengirim sebagai respons jika server memahami tipe konten entitas permintaan dan sintaks entitas permintaan sudah benar tetapi tidak dapat memproses data karena kesalahan semantiknya.
Situasi 400 lebih dari 422:
Ingat, kode respons 422 adalah kode status HTTP diperpanjang (WebDAV). Masih ada beberapa klien HTTP / perpustakaan front-end yang tidak siap untuk menangani 422. Bagi mereka, ini sesederhana "HTTP 422 salah, karena itu bukan HTTP" . Dari perspektif layanan, 400 tidak terlalu spesifik.
Dalam arsitektur perusahaan, layanan ini sebagian besar digunakan pada lapisan layanan seperti SOA, IDM, dll. Mereka biasanya melayani beberapa klien mulai dari klien asli yang sangat lama hingga klien HTTP terbaru. Jika salah satu klien tidak menangani HTTP 422, opsinya adalah meminta klien untuk meningkatkan atau mengubah kode respons Anda ke HTTP 400 untuk semua orang. Dalam pengalaman saya, ini sangat jarang hari ini tetapi masih ada kemungkinan. Jadi, studi yang cermat tentang arsitektur Anda selalu diperlukan sebelum memutuskan kode respons HTTP.
Untuk menangani situasi seperti ini, lapisan layanan biasanya menggunakan
versioning
atau mensetupconfiguration
bendera untuk klien kepatuhan HTTP ketat untuk mengirim 400, dan mengirim 422 untuk sisanya. Dengan cara itu mereka memberikan dukungan kompatibilitas mundur untuk konsumen yang sudah ada tetapi pada saat yang sama memberikan kemampuan bagi klien baru untuk mengkonsumsi HTTP 422.Pembaruan terbaru untuk RFC7321 mengatakan:
Ini mengonfirmasi bahwa server dapat mengirim HTTP 400 untuk permintaan yang tidak valid. 400 tidak merujuk hanya ke kesalahan sintaks lagi , bagaimanapun, 422 masih merupakan respon asli asalkan klien dapat menanganinya.
sumber
Pertama, ini adalah pertanyaan yang sangat bagus.
400 Permintaan Buruk - Ketika ada informasi penting yang hilang dari permintaan
mis. Header otorisasi atau header tipe konten. Yang mutlak diperlukan oleh server untuk memahami permintaan. Ini dapat berbeda dari server ke server.
422 Entitas yang tidak dapat diproses - Saat badan permintaan tidak dapat diuraikan.
Ini kurang parah dari 400. Permintaan telah mencapai server. Server telah mengakui permintaan telah mendapatkan struktur dasar yang benar. Tetapi informasi di badan permintaan tidak dapat diuraikan atau dipahami.
mis.
Content-Type: application/xml
ketika badan permintaan JSON.Berikut ini adalah artikel yang mencantumkan kode status dan penggunaannya dalam REST APIs. https://metamug.com/article/status-codes-for-rest-api.php
sumber
Anda harus benar-benar mengembalikan "200 OK" dan di badan respons sertakan pesan tentang apa yang terjadi dengan data yang diposting. Maka terserah aplikasi Anda untuk memahami pesannya.
Masalahnya, kode status HTTP persis seperti itu - kode status HTTP. Dan itu dimaksudkan hanya memiliki arti pada lapisan transportasi, bukan pada lapisan aplikasi. Lapisan aplikasi harus benar-benar tidak pernah tahu bahwa HTTP sedang digunakan. Jika Anda memindahkan lapisan transportasi Anda dari HTTP ke Homing Pigeons, itu tidak akan mempengaruhi lapisan aplikasi Anda dengan cara apa pun.
Biarkan saya memberi Anda contoh non-virtual. Katakanlah Anda jatuh cinta dengan seorang gadis dan dia mencintai Anda kembali tetapi keluarganya pindah ke negara yang sama sekali berbeda. Dia memberi Anda alamat siputnya yang baru. Secara alami, Anda memutuskan untuk mengiriminya surat cinta. Jadi, Anda menulis surat, memasukkannya ke dalam amplop, menuliskan alamatnya di amplop, menempelkan perangko di atasnya, dan mengirimkannya. Sekarang mari kita pertimbangkan skenario ini
Singkatnya: Mengembalikan "200 OK" tidak berarti aplikasi server memiliki kabar baik untuk Anda. Itu hanya berarti ada berita.
PS: Kode status 422 hanya memiliki arti dalam konteks WebDAV. Jika Anda tidak bekerja dengan WebDAV, maka 422 memiliki arti standar yang persis sama dengan kode non-standar lainnya = yang tidak ada.
sumber