Pregunta

Tenemos una API REST a la que los clientes rutinariamente PUBLICAN y PONEN datos. Cuando hacen esto, a veces PUBLICAN datos que no producen cambios en nuestro sistema. Los POST y PUT están bien formados, pero los datos que envían son idénticos a los datos de nuestra base de datos. Cuando esto sucede, me acabo de enterar de que estamos devolviendo un estado HTTP 400. Desafortunadamente, esto significa "mala solicitud" como en " request no pudo ser entendido por el servidor debido a una sintaxis malformada " ;.

Claramente, este no es el caso, pero me dijeron que vamos a usar esto ya que no hay otro código de estado apropiado. Opciones que hemos considerado:

  • 304 no modificado. Lamentablemente, esto es solo para solicitudes GET.
  • 204 Sin contenido. Parece cercano, pero prohíbe un cuerpo de entidad.

Otras opciones parecen igualmente malas. Podríamos ir con 200 OK y tener la información relevante en el documento XML que devolvemos, pero esto no parece muy "RESTish". ¿Cómo maneja esto el mundo REST en general?

(Código de respuesta fijo no modificado. Gracias Mkoeller)

¿Fue útil?

Solución

Creo que está perfectamente bien devolver un 200 OK en ese caso, los datos se procesaron correctamente y el servidor hizo lo que tenía que hacer. Debido a que el servidor procesó correctamente los datos, debería devolver un código de estado correcto. El hecho de que lo haya ignorado internamente es o debería ser irrelevante.

Lo que el servidor hizo con los datos no se debe decir a los clientes, se les debe decir lo que sucedió con la solicitud (procesado bien, se produjo un error y similares).

Y si, por alguna extraña razón (no puedo pensar que sea válida, por cierto), es de interés para los clientes, usted tiene la respuesta para decirles eso.

Otros consejos

Si los clientes pueden conocer la etiqueta de entidad para el contenido en el servidor antes de PONER, entonces se utilizan encabezados If-Match y la respuesta 412 Precondition Failed para exactamente la situación que usted describe.

Desde la vista del cliente, el estado del servidor es el mismo si el contenido de la solicitud era el mismo en el servidor o no, ¿verdad? Dado que el servidor luego retiene exactamente el contenido que se envió, ¿por qué debería responder el servidor con algún tipo de estado de error? Por otro lado, ¿por qué debería molestarse el cliente si el contenido de la solicitud es el mismo que el servidor ya conoce? Se transfirió con éxito al servidor, por lo que se realiza la mayor parte del trabajo. ¿Cómo se espera que reaccione un cliente si hubiera un código de respuesta diferente para esta situación?

Conclusión: su situación de una solicitud de contenido que iguala el contenido existente no es un caso especial. Debe responder con el mismo código de estado de respuesta. Eso podría ser 200, 302 o 303.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top