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?
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
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
).
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.