Estoy creando una aplicación con una API basada en REST y he llegado al punto en el que estoy especificando códigos de estado para cada solicitud.
¿Qué código de estado debo enviar para las solicitudes que fallan en la validación o cuando una solicitud intenta agregar un duplicado en mi base de datos?
He revisado http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html pero ninguno parece correcto.
¿Existe una práctica común al enviar códigos de estado?
http
rest
http-status-codes
alexn
fuente
fuente
Respuestas:
Para la falla de validación de entrada: 400 Bad Request + su descripción opcional. Esto se sugiere en el libro " RESTful Web Services ". Para envío doble: 409 Conflicto
Actualización de junio de 2014
La especificación relevante solía ser RFC2616 , que daba el uso de 400 (Solicitud incorrecta) de forma bastante limitada como
Por lo tanto, podría haberse argumentado que no era apropiado para errores semánticos. Pero ya no más; desde junio de 2014, la norma relevante RFC 7231 , que reemplaza a la RFC2616 anterior, da el uso de 400 (Solicitud incorrecta) más ampliamente como
fuente
something perceived to be a client error
todos los ejemplos dados en este párrafo son violaciones del protocolo HTTP, no errores lógicos: sintaxis, encuadre, enrutamiento. Por lo tanto, considero que la especificación HTTP no permite 400 para la validación fallida en el nivel de la aplicación.Definitivamente debe dar una explicación más detallada en los encabezados y / o el cuerpo de la respuesta (por ejemplo, con un encabezado personalizado -
X-Status-Reason: Validation failed
).fuente
HTTP/1.0 403 Form validation errors
es la forma más clara de hacerlo.Recomiendo el código de estado 422, "Entidad no procesable" .
fuente
200,300, 400, 500 son todos muy genéricos. Si quieres genérico, 400 está bien.
422 es utilizado por un número cada vez mayor de API e incluso Rails lo utiliza de forma inmediata.
No importa qué código de estado elija para su API, alguien estará en desacuerdo. Pero prefiero 422 porque pienso en '400 + text status' como demasiado genérico. Además, no está aprovechando un analizador listo para JSON; en contraste, un 422 con una respuesta JSON es muy explícito, y se puede transmitir una gran cantidad de información de error.
Hablando de la respuesta JSON, tiendo a estandarizar la respuesta de error de Rails para este caso, que es:
Este formato es perfecto para la validación de formularios, que considero el caso más complejo para admitir en términos de "riqueza de informes de errores". Si su estructura de error es esta, es probable que maneje todas sus necesidades de informes de errores.
fuente
arg1
es válido yarg2
es válido, pero la combinación de los dos, con los valores específicos enviados, no es válida.200
Ugh ... (309, 400, 403, 409, 415, 422) ... muchas respuestas tratando de adivinar, argumentar y estandarizar cuál es el mejor código de retorno para una solicitud HTTP exitosa pero una llamada REST fallida .
Esta mal mezclar códigos de estado HTTP y códigos de estado REST.
Sin embargo, vi muchas implementaciones mezclándolas, y muchos desarrolladores pueden no estar de acuerdo conmigo.
Los códigos de retorno HTTP están relacionados con el
HTTP Request
mismo. Una llamada REST se realiza mediante una solicitud de Protocolo de transferencia de hipertexto y funciona a un nivel inferior al método REST invocado. REST es un concepto / enfoque, y su salida es un resultado comercial / lógico , mientras que el código de resultado HTTP es de transporte .Por ejemplo, devolver "404 No encontrado" cuando llama a / users / es confuso, porque puede significar:
"403 Prohibido / Acceso denegado" puede significar:
Y la lista puede continuar con '500 Server error "(un error de Apache / Nginx HTTP lanzado o un error de restricción comercial en REST) u otros errores de HTTP, etc.
Según el código, es difícil entender cuál fue la razón de la falla, una falla HTTP (transporte) o una falla REST (lógica).
Si la solicitud HTTP se realizó físicamente con éxito, siempre debe devolver el código 200, independientemente de si el registro se encuentra o no. Porque el recurso URI se encuentra y fue manejado por el servidor HTTP. Sí, puede devolver un conjunto vacío. ¿Es posible recibir una página web vacía con 200 como resultado HTTP, verdad?
En lugar de esto, puede devolver 200 códigos HTTP con algunas opciones:
Además, algunos proveedores de Internet pueden interceptar sus solicitudes y devolverle un código HTTP 404. Esto no significa que no se encuentren sus datos, pero es algo incorrecto a nivel de transporte.
De Wiki :
¿Por qué no simplemente responder con algo como esto?
Google siempre devuelve 200 como código de estado en su API de geocodificación, incluso si la solicitud falla lógicamente: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
Facebook siempre devuelve 200 para solicitudes HTTP exitosas, incluso si la solicitud REST falla: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling
Es simple, los códigos de estado HTTP son para solicitudes HTTP. REST API es suya, defina sus códigos de estado.
fuente
BadRequest()
método .NET tiene su propio modelo de devolución que diferirá de su modelo de devolución regular. Esa es una pesadilla para analizar. @KevinHooke, devolver HTTP 200 para un error de validación REST es como decir: "Recibí su mensaje, la respuesta es no, y he aquí por qué". Al volver HTTP 400 dice: "No sé de qué estás hablando".Un duplicado en la base de datos debe ser un
409 CONFLICT
.Recomiendo usar
422 UNPROCESSABLE ENTITY
para errores de validación.Doy una explicación más larga de los códigos 4xx aquí .
fuente
El código de estado 304 no modificado también respondería de manera aceptable a una solicitud duplicada. Esto es similar a procesar un encabezado de
If-None-Match
usar una etiqueta de entidad.En mi opinión, la respuesta de @ Piskvor es la elección más obvia de lo que percibo como la intención de la pregunta original, pero tengo una alternativa que también es relevante.
Si desea tratar una solicitud duplicada como una advertencia o notificación en lugar de un error, un código de estado de respuesta de
304
No modificado yContent-Location
encabezado que identifique el recurso existente sería igual de válido. Cuando la intención es simplemente garantizar que exista un recurso, una solicitud duplicada no sería un error sino una confirmación. La solicitud no es incorrecta, pero es simplemente redundante, y el cliente puede consultar el recurso existente.En otras palabras, la solicitud es buena, pero dado que el recurso ya existe, el servidor no necesita realizar ningún procesamiento adicional.
fuente
El adaptador ActiveRecord de Ember-Data espera
422 UNPROCESSABLE ENTITY
ser devuelto por el servidor. Entonces, si su cliente está escrito en Ember.js, debe usar 422. Solo entonces DS.Errors se completará con los errores devueltos. Por supuesto, puede cambiar 422 a cualquier otro código en su adaptador.fuente
406 - No aceptable
Lo que significa que esta respuesta se envía cuando el servidor web, después de realizar una negociación de contenido dirigida por el servidor, no encuentra ningún contenido que cumpla con los criterios dados por el agente de usuario.
fuente