Saya memiliki permintaan JSON yang saya posting ke URL HTTP.
Hal ini harus diperlakukan sebagai 400
mana requestedResource
lapangan ada tapi "Roman"
adalah nilai yang tidak valid untuk bidang ini?
[{requestedResource:"Roman"}]
Hal ini harus diperlakukan sebagai 400
mana "blah"
lapangan tidak ada sama sekali?
[{blah:"Roman"}]
rest
http
error-handling
http-status-code-400
Phoenix
sumber
sumber
Roman
, mereka hanya perlu membayar lebih untuk Anda :)Jawaban:
A 400 berarti bahwa permintaan salah. Dengan kata lain, aliran data yang dikirim oleh klien ke server tidak mengikuti aturan.
Dalam kasus REST API dengan payload JSON, 400's biasanya, dan dengan benar saya katakan, digunakan untuk menunjukkan bahwa JSON tidak valid dalam beberapa cara sesuai dengan spesifikasi API untuk layanan.
Dengan logika itu, kedua skenario yang Anda berikan harus 400-an.
Bayangkan saja ini XML dan bukan JSON. Dalam kedua kasus, XML tidak akan pernah melewati validasi skema - baik karena elemen yang tidak terdefinisi atau nilai elemen yang tidak tepat. Itu akan menjadi permintaan yang buruk. Kesepakatan yang sama di sini.
sumber
Dari w3.org
sumber
Memilih kode respons HTTP adalah tugas yang cukup mudah dan dapat dijelaskan dengan aturan sederhana. Satu-satunya bagian rumit yang sering dilupakan adalah paragraf 6.5 dari RFC 7231:
Aturannya adalah sebagai berikut:
Jadi dalam kasus Anda, saya akan mengembalikan 400 kesalahan dan sesuatu seperti ini jika "Roman" diperoleh dari input pengguna dan klien harus memiliki reaksi spesifik:
atau kesalahan yang lebih umum, jika situasi seperti itu adalah kesalahan logika yang buruk pada klien dan tidak diharapkan, kecuali pengembang membuat kesalahan:
sumber
Dalam kedua kasus tidak ada "sintaksis cacat". Semantik yang salah. Oleh karena itu, IMHO 400 tidak pantas. Sebagai gantinya, akan lebih tepat untuk mengembalikan 200 bersama dengan beberapa jenis objek kesalahan seperti
{ "error": { "message": "Unknown request keyword" } }
atau apa pun.Pertimbangkan jalur pemrosesan klien. Kesalahan dalam sintaksis (misalnya JSON tidak valid) adalah kesalahan dalam logika program, dengan kata lain bug dari beberapa jenis, dan harus ditangani sesuai, dengan cara yang mirip dengan 403, katakanlah; dengan kata lain, sesuatu yang buruk telah salah.
Kesalahan dalam nilai parameter, di sisi lain, adalah kesalahan semantik, mungkin karena mengatakan input pengguna yang divalidasi dengan buruk. Ini bukan kesalahan HTTP (meskipun saya kira itu bisa menjadi 422). Jalur pemrosesan akan berbeda.
Sebagai contoh, di jQuery, saya lebih suka tidak harus menulis penangan kesalahan tunggal yang berhubungan dengan kedua hal seperti 500 dan beberapa kesalahan semantik khusus aplikasi. Kerangka kerja lain, Ember for one, juga memperlakukan kesalahan HTTP seperti 400 dan 500 secara identik sebagai kegagalan besar, yang mengharuskan programmer untuk mendeteksi apa yang terjadi dan bercabang tergantung pada apakah itu kesalahan "nyata" atau tidak.
sumber
Menggunakan
400
kode status untuk tujuan lain apa pun selain menunjukkan bahwa permintaan yang salah benar-benar salah.Jika payload permintaan berisi urutan byte yang tidak dapat diuraikan sebagai
application/json
(jika server mengharapkan format data itu), kode status yang sesuai adalah415
:Jika payload permintaan secara sintaksis benar tetapi semantik salah,
422
kode respons non-standar dapat digunakan, atau403
kode status standar :sumber
image/gif
bukantext/json
diContent-Type:
header. - mungkin ini juga berlaku jika komponen multipart memiliki tipe yang salah ditentukan, lihat tools.ietf.org/html/rfc4918 di mana ia membahas 422 untuk diskusi lebih lanjut,Pikirkan tentang harapan.
Sebagai aplikasi klien, Anda berharap tahu jika ada masalah di sisi server. Jika server perlu melakukan kesalahan saat
blah
hilang ataurequestedResource
nilainya salah dari kesalahan 400 akan sesuai.sumber
Sebagai pelengkap, bagi mereka yang mungkin memenuhi masalah yang sama dengan saya, saya menggunakan
$.ajax
untuk mengirim data formulir ke server dan saya juga mendapat400
kesalahan pada awalnya.Asumsikan saya memiliki variabel javascript,
Jangan gunakan variabel
formData
secara langsung sebagai nilai kuncidata
seperti di bawah ini:Sebaliknya, gunakan JSON.stringify untuk merangkum
formData
seperti di bawah ini:Lagi pula, seperti yang telah diilustrasikan orang lain, kesalahannya adalah karena server tidak dapat mengenali permintaan yang menyebabkan sintaksis salah bentuk, saya hanya memunculkan contoh saat latihan. Semoga bermanfaat bagi seseorang.
sumber
Pertama periksa URL itu mungkin salah, jika sudah benar maka periksa badan permintaan yang Anda kirim, kemungkinan penyebabnya adalah permintaan yang Anda kirim tidak ada sintaks benar.
Untuk menguraikan, periksa karakter khusus dalam string permintaan. Jika itu (char khusus) sedang digunakan ini adalah akar penyebab kesalahan ini.
coba salin permintaan dan analisis masing-masing dan setiap data tag.
sumber