Código de estado HTTP para una solicitud satisfactoria parcial

115

Tengo una aplicación que envía mensajes a los usuarios. En una solicitud de publicación se transfiere una cadena XML que consta de todos los usuarios que deberían recibir ese mensaje en particular. Si alguno de los usuarios de la lista no existe, le devuelvo la lista de usuarios perdidos al cliente para una evaluación adicional.

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 hubo cosas que no se pudieron hacer.

El problema se evitaría si no se permitiera incluir a los usuarios que faltan en la lista. Entonces, el intento de envío solo 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 mirar en profundidad la respuesta de error. por ejemplo, para evitar enviar mensajes a esos usuarios una y otra vez

Norbert Hartl
fuente

Respuestas:

66

Me he ocupado de un problema muy similar. En este caso, devolví un

207 multiestado

Ahora, esto no es HTTP estricto, es parte de la extensión WebDAV, así que si no tienes control sobre el cliente también, entonces esto no es bueno para ti. Si lo hace, podría hacer algo como esto:

   <?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 también debe tener el control del cliente.

Kylar
fuente
3
Pensé en usar esto, pero no estaba muy cómodo con él. ¡Gracias!
Norbert Hartl
Lo bueno de esto es que puede devolver tantos o pocos datos pertinentes como desee, lo cual es especialmente útil para conjuntos de datos mixtos, es decir, donde algunos fallan y otros pasan.
Kylar
Entiendo. Solo estoy tratando de evitar un nivel adicional de manejo de estado (lo cual no es agradable en mi humilde opinión). La mayor parte de mi código funciona con HTTP. Y creo que mi caso de uso descrito funcionará bien sin.
Norbert Hartl
Siempre puede devolver un cuerpo: envíe un 200 con una respuesta JSON o lo que desee para determinar cuáles tuvieron éxito.
Kylar
Sí, lo sé. Pero si devuelve un cuerpo, debe analizarlo. Y en ese momento introduce una segunda capa de manejo lógico de la aplicación. Esto aumenta la complejidad y necesita una buena razón para hacerlo.
Norbert Hartl
65

Tuve el mismo problema y terminé usando dos soluciones diferentes:

  • Código de retorno HTTP 202: Accepted, que indica que la solicitud fue correcta, pero no hay garantía de que todo haya ido como debería.
  • Devuelve un valor normal 200en la respuesta, pero incluye una lista de lo que no resultó en el cuerpo de la respuesta.

El segundo generalmente funciona mejor, pero el primero es excelente si eres vago o usas una cola para procesar.

Arne
fuente
5
¿No 202 se refiere más a algo como hacer cola?
Sinaesthetic
6
Sí, @Sinaesthetic. Según la especificación HTTP 1.1 más reciente, "(...) la solicitud se ha aceptado para su procesamiento, pero el procesamiento no se ha completado". Entonces, para un éxito parcial, 202 no es apropiado.
Huercio
-4

¿Qué hay de usar 206 Partial Content? Sé que 206 se trata más de rangos, pero ¿y si pudiera indicar una solicitud parcialmente exitosa?

Yusuf
fuente
MDN establece lo siguiente: "El código de respuesta de estado de éxito de contenido parcial HTTP 206 indica que la solicitud se ha realizado correctamente y que el cuerpo contiene los rangos de datos solicitados, como se describe en el encabezado Rango de la solicitud". Hasta donde tengo entendido, 206 Partial Content es estrictamente para solicitudes con un rango de contenido.
sbbs
-14

El Protocolo de transferencia de hipertexto se ocupa del lado de la transmisión de las cosas. No tiene códigos de error para lidiar con errores de nivel de aplicación.

Devolver 200 es lo correcto aquí. En lo que respecta a HTTP, la solicitud se recibió correctamente, se manejó correctamente y está enviando la respuesta. Entonces, en el nivel HTTP, todo está bien. Cualquier error o advertencia relacionado con la aplicación que se ejecuta sobre http debe estar dentro de la respuesta. Si lo hace, también evitará algunos problemas desagradables que puede encontrar con los servidores proxy que pueden no manejar ciertas respuestas de la manera esperada.

AVee
fuente
18
HTTP es un protocolo de nivel de aplicación. No se puede poner simplemente a nivel de transporte y aplicación. Si piensa en OSI, HTTP está en las capas 5-7. HTTP es algo diferente. La mayoría de los encabezados y códigos de retorno son de hecho específicos de la aplicación. Los códigos solo dependen de la información proporcionada en las entidades del protocolo HTTP y no de los formatos de aplicaciones personalizados. Con respecto al 200, diría que su definición es puramente incorrecta si se aplica a verbos que no son POST. Pero POST cambia un poco el juego y, en este contexto, su suposición "manejada correctamente" tampoco es segura
Norbert Hartl
Estrictamente hablando, OSI considera HTTP como un protocolo de nivel de aplicación y cuando se habla con un servidor web "normal", esto es cierto. Pero en su caso, está ejecutando su propio protocolo sobre HTTP, como lo hacen muchas aplicaciones en estos días. En ese tipo de uso, HTTP solo proporciona el transporte. (Su aplicación envía mensajes a los usuarios, no transfiere hipertexto ...)
AVee
2
Para ser claro. HTTP de forma REST está centrado en los recursos. En este contexto, 200 significa identidad (el recurso que especificó) en lugar de 3xx, que apunta en la dirección de la identidad. El uso de POST convierte el URI del recurso en un URI de procesamiento y los códigos de error deben hacer frente a eso. El contexto cambia un poco y la definición de las cosas se vuelve un poco borrosa o al menos difícil de entender
Norbert Hartl
1
El cambio de contexto también significa que no hay códigos de error adecuados, ya que el protocolo nunca fue diseñado con ese contexto en mente ;-) También creo que debe tener cuidado con el uso de códigos de error ya que los servidores proxy tienden a ejecutarse con ellos reemplazando su respuesta con un página de error personalizada, esto puede ser un PITA real.
AVee
1
De todos modos, gracias por responder a mi pregunta. Acabo de descubrir que stackoverflow es un mal cliente de chat :)
Norbert Hartl