Códigos de estado REST HTTP para la validación fallida o el duplicado no válido

Estoy construyendo una aplicación con una API basada en REST y he llegado al punto de especificar códigos de estado para cada solicitud.

Qué código de estado debo enviar para las solicitudes que fallan la validación o cuando una solicitud está tratando de añadir un duplicado en mi base de datos?

He mirado en http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html pero ninguno parece correcto.

¿Existe una práctica común a la hora de enviar códigos de estado?

Solución

Para el fallo de validación de la entrada: 400 Bad Request + su descripción opcional. Esto se sugiere en el libro "RESTful Web Services". Por doble envío: 409 Conflicto


Actualización junio 2014

La especificación relevante solía ser RFC2616, que daba el uso de 400 (Bad Request) de forma bastante limitada como

La solicitud no pudo ser entendida por el servidor debido a una sintaxis malformada

Así que podría haberse argumentado que era inapropiado para los errores semánticos. Pero ya no; desde junio de 2014 el estándar correspondiente RFC 7231, que sustituye al anterior RFC2616, da el uso de 400 (Bad Request) de forma más amplia como

el servidor no puede o no procesará la solicitud debido a algo que se percibe como un error del cliente

Comentarios (11)
  • Validación fallida: 403 Forbidden ("El servidor entendió la solicitud, pero se niega a cumplirla"). En contra de la opinión popular, el RFC2616 no dice "403 sólo está pensado para la autenticación fallida", sino "403: Sé lo que quieres, pero no lo haré". Esa condición puede ser o no debida a la autenticación.
  • Intentando añadir un duplicado: 409 Conflicto ("La solicitud no pudo completarse debido a un conflicto con el estado actual del recurso").

Definitivamente deberías dar una explicación más detallada en las cabeceras y/o cuerpo de la respuesta (por ejemplo, con una cabecera personalizada - X-Status-Reason: Validation failed).

Comentarios (19)

Recomiendo código de estado 422, "Entidad no procesable".

11.2. 422 Entidad no procesable

El código de estado 422 (Entidad no procesable) significa que el servidor entiende el tipo de contenido de la entidad solicitada (por lo que un código de estado 415 (Tipo de medio no soportado) es inapropiado), y la sintaxis de la entidad solicitada es correcta (por lo que un código de estado 400 (Solicitud incorrecta) es inapropiado) pero no pudo procesar las instrucciones contenidas. Por ejemplo, esta condición de error puede ocurrir si un cuerpo de solicitud XML contiene instrucciones XML bien formadas (es decir, sintácticamente correctas), pero semánticamente erróneas.

Comentarios (14)