restful - Código de estado HTTP para una solicitud parcial exitosa
rest api (3)
El protocolo de transferencia de hipertexto se ocupa del lado de transmisión de las cosas. No tiene códigos de error para tratar los errores de nivel de aplicación.
Regresar 200 es lo correcto para hacer aquí. En lo que respecta a HTTP, la solicitud se recibió correctamente, se manejó correctamente y usted está devolviendo la respuesta. Entonces, en el nivel HTTP, todo está bien. Cualquier error o advertencia relacionada con la aplicación que se ejecute sobre http debe estar dentro de la respuesta. Si lo hace, también evitará algunos problemas desagradables con los que se puede encontrar con los servidores proxy, que podrían no manejar ciertas respuestas de la manera esperada.
Tengo una aplicación que envía mensajes a los usuarios. En una solicitud posterior, se transfiere una cadena XML que consta de todos los usuarios que deben recibir ese mensaje en particular. Si alguno de los usuarios de la lista no existe, devuelvo al cliente la lista de usuarios que faltan para una evaluación posterior.
Ahora me pregunto cuál sería el código de estado adecuado para la aplicación que dice que la solicitud fue aceptada, pero que hay cosas que no se pueden hacer.
El problema se evitaría si no se permitiera incluir usuarios perdidos en la lista. Entonces, el intento de envío obtendría un error 4xx. Pero no tiene sentido formar la API de esta manera. Por otro lado, podría considerar que la condición de error es puramente específica de la aplicación. Pero enviar un 200 simplemente no se siente bien. Y sería bueno darle al cliente una pista sobre cuándo buscar profundamente en la respuesta de error. por ejemplo, para evitar enviar mensajes a los usuarios una y otra vez
He tratado con un problema muy similar. En este caso, devolví un
207 Multi-Status
Ahora bien, esto no es estrictamente HTTP, es parte de la extensión WebDAV, por lo que si usted no tiene control sobre el cliente también, esto no es bueno para usted. Si lo haces, podrías hacer algo como eso:
<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D=''DAV:''>
<D:response>
<D:user>user-123</D:user>
<D:status>success</D:status>
</D:response>
<D:response>
<D:user>user-789</D:user>
<D:status>failure</D:status>
</D:response>
</D:multistatus>
Pero, de nuevo, esta es una extensión HTTP, y usted necesita tener el control del cliente también.
Tuve el mismo problema y terminé usando dos soluciones diferentes:
- Código de retorno HTTP
202: Accepted
, lo que indica que la solicitud fue correcta, pero no hay garantía de que todo haya funcionado como debería. - Devuelve un
200
normal en la respuesta, pero incluya una lista de lo que no funcionó en el cuerpo de la respuesta.
El segundo generalmente funciona mejor, pero el primero es genial si eres flojo o usas una cola para procesar.