2008-11-12 8 views
11

Tenemos una API REST a la cual los clientes rutinariamente POSTAN 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 en nuestra base de datos. Cuando esto sucede, acabo de descubrir que estamos devolviendo un estado 400 HTTP. Desafortunadamente, esto significa "solicitud incorrecta" como en "la solicitud no pudo ser entendida por el servidor debido a una sintaxis mal formada".RESTO: Corregir el código de respuesta HTTP para un POST que se omite

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. Esto, lamentablemente, es solo para solicitudes GET.
  • 204 Sin contenido. Parece estar cerca, 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?

(fijo no Modificado código de respuesta. Gracias Mkoeller)

+0

HTTP Status 302 se denomina "Found". – mkoeller

Respuesta

17

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. Como 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 contar a los clientes, se les debe decir lo que sucedió con la solicitud (se procesó bien, se produjo un error, etc.).

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

1

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

Conclusión: Su situación de un contenido de solicitud que iguale 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.

2

Si los clientes pueden conocer la etiqueta de entidad para el contenido en el servidor antes de PUT, entonces el uso de los encabezados If-Match y la respuesta 412 Condición previa fallida existe exactamente para la situación que describe.

+0

Quieres decir 'If-None-Match' –

Cuestiones relacionadas