Tengo una solicitud JSON que estoy publicando en una URL HTTP.
¿Debería tratarse esto como 400
donde requestedResource
existe el campo pero "Roman"
es un valor no válido para este campo?
[{requestedResource:"Roman"}]
¿Debería tratarse esto como 400
donde el "blah"
campo no existe en absoluto?
[{blah:"Roman"}]
Roman
, solo necesitan pagarle más :)Respuestas:
Un 400 significa que la solicitud fue malformada. En otras palabras, el flujo de datos enviado por el cliente al servidor no siguió las reglas.
En el caso de una API REST con una carga útil JSON, los 400 son típicamente, y diría correctamente, que se utilizan para indicar que el JSON no es válido de alguna manera de acuerdo con la especificación API para el servicio.
Según esa lógica, los dos escenarios que proporcionó deben ser de 400.
Imagínese, en cambio, que fuera XML en lugar de JSON. En ambos casos, el XML nunca pasaría la validación del esquema, ya sea debido a un elemento indefinido o un valor de elemento incorrecto. Esa sería una mala solicitud. El mismo trato aquí.
fuente
De w3.org
fuente
Seleccionar un código de respuesta HTTP es una tarea bastante fácil y puede describirse mediante reglas simples. La única parte difícil que a menudo se olvida es el párrafo 6.5 del RFC 7231:
Las reglas son las siguientes:
Entonces, en su caso, devolví un error 400 y algo como esto si se obtiene "Roman" de la entrada del usuario y el cliente debe tener una reacción específica:
o un error más genérico, si dicha situación es un error lógico incorrecto en un cliente y no se espera, a menos que el desarrollador haya hecho algo incorrecto:
fuente
En ninguno de los casos la "sintaxis está mal formada". Son las semánticas las que están equivocadas. Por lo tanto, en mi humilde opinión un 400 es inapropiado. En cambio, sería apropiado devolver un 200 junto con algún tipo de objeto de error como
{ "error": { "message": "Unknown request keyword" } }
o lo que sea.Considere las rutas de procesamiento del cliente. Un error en la sintaxis (por ejemplo, JSON no válido) es un error en la lógica del programa, en otras palabras, un error de algún tipo, y debe manejarse en consecuencia, de manera similar a un 403, por ejemplo; en otras palabras, algo malo salió mal.
Un error en un valor de parámetro, por otro lado, es un error de semántica, tal vez debido a una entrada de usuario mal validada. No es un error HTTP (aunque supongo que podría ser un 422). La ruta de procesamiento sería diferente.
Por ejemplo, en jQuery, preferiría no tener que escribir un único controlador de errores que se ocupe de cosas como 500 y algún error semántico específico de la aplicación. Otros marcos, Ember para uno, también tratan los errores HTTP como los 400 y 500 de manera idéntica como grandes fallas gordas, lo que requiere que el programador detecte lo que está sucediendo y se ramifique dependiendo de si es un error "real" o no.
fuente
Usar
400
códigos de estado para cualquier otro propósito que no sea indicar que la solicitud está mal formada es simplemente incorrecto.Si la carga útil de la solicitud contiene una secuencia de bytes que no se pudo analizar como
application/json
(si el servidor espera ese formato de datos), el código de estado apropiado es415
:Si la carga útil de la solicitud es sintácticamente correcta pero semánticamente incorrecta,
422
se puede usar el código de respuesta no estándar o el403
código de estado estándar :fuente
image/gif
lugar detext/json
en elContent-Type:
encabezado. - presumiblemente esto también es aplicable si un componente de una multiparte tiene el tipo incorrecto especificado, vea tools.ietf.org/html/rfc4918 donde se analiza 422 para más discusión,Piensa en las expectativas.
Como aplicación cliente, espera saber si algo sale mal en el lado del servidor. Si el servidor necesita arrojar un error cuando
blah
falta o elrequestedResource
valor es incorrecto, sería apropiado un error 400.fuente
Como complemento, para aquellos que podrían tener el mismo problema que el mío, estoy usando
$.ajax
para publicar datos del formulario en el servidor y también recibí el400
error al principio.Supongamos que tengo una variable de JavaScript,
No use la variable
formData
directamente como el valor de la clavedata
como a continuación:En su lugar, use JSON.stringify para encapsular lo
formData
siguiente:De todos modos, como otros han ilustrado, el error se debe a que el servidor no pudo reconocer que la solicitud causaba una sintaxis incorrecta, solo estoy planteando una instancia en la práctica. Espero que sea útil para alguien.
fuente
Primero verifique la URL, puede estar equivocada, si es correcta, luego verifique el cuerpo de la solicitud que está enviando, la posible causa es que la solicitud que está enviando no tiene la sintaxis correcta.
Para elaborar, verifique si hay caracteres especiales en la cadena de solicitud. Si se está utilizando (char especial), esta es la causa raíz de este error.
intente copiar la solicitud y analice todos y cada uno de los datos de etiquetas.
fuente