Suprimir se supone que es idempotente.
Si ELIMINO http://example.com/account/123 eliminará la cuenta.
Si lo vuelvo a hacer, ¿esperaría un 404, ya que la cuenta ya no existe? ¿Qué sucede si intento ELIMINAR una cuenta que nunca existió?
http
rest
http-headers
Ben Noland
fuente
fuente
Respuestas:
Idempotencia se refiere al estado del sistema después de que la solicitud se haya completado.
En todos los casos (aparte de los problemas de error, ver más abajo), la cuenta ya no existe.
Desde aqui
El bit clave es que los efectos secundarios de N> 0 solicitudes idénticas son las mismas que para una sola solicitud.
Sería correcto esperar que el código de estado sería diferente, pero esto no afecta el concepto central de idempotencia: puede enviar la solicitud más de una vez sin cambios adicionales en el estado del servidor.
fuente
Idempotent es sobre el efecto de la solicitud, no sobre el código de respuesta que obtienes.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2 dice:
Si bien puede obtener un código de respuesta diferente, el efecto del envío de solicitudes DELETE N + 1 al mismo recurso puede considerarse el mismo.
fuente
La distinción importante es que idempotente se refiere a los efectos secundarios , no a todos los efectos o respuestas. Si lo hace
DELETE http://example.com/account/123
, el efecto es que la cuenta 123 ahora se elimina del servidor. Ese es el único efecto, el único cambio al estado del servidor. Ahora digamos queDELETE http://example.com/account/123
vuelve a hacer la misma solicitud, el servidor responderá de manera diferente, pero su estado es el mismo.No es como si la solicitud DELETE hubiera decidido cambiar el estado del servidor de una manera diferente porque faltaba la cuenta, como eliminar otra cuenta o dejar un registro de errores. No, puede llamar a la misma solicitud DELETE un millón de veces y puede estar seguro de que el servidor está en el mismo estado que estaba la primera vez que lo llamó .
fuente
Desde el HTTP RFC :
Tenga en cuenta que eso es "efectos secundarios", no "respuesta".
fuente
Si. Independientemente del código de respuesta.
Desde el último RFC para HTTP 1.1 (énfasis mío):
Dice explícitamente que la respuesta puede diferir. Más importante aún, señala la razón del concepto: si una acción es idempotente, el cliente puede repetir la acción cuando encuentra algún error, y sabe que no se bloqueará nada al hacerlo; de lo contrario, el cliente deberá realizar una consulta adicional (posiblemente
GET
) para ver si la anterior es efectiva, antes de repetir la acción de manera segura. Mientras el servidor pueda hacer tal garantía, la acción es idempotente. Cita de otro comentario :fuente
Creo que lo mismo, 404: la cuenta no existe.
Podrías argumentar 400 - Mala solicitud. Pero en el sentido de REST, el objeto sobre el que solicitó realizar una acción no existe. Eso se traduce en 404.
fuente
Citado de mi otra respuesta aquí :
Históricamente, RFC 2616, publicado en 1999, era la especificación HTTP 1.1 más referenciada. Lamentablemente, su descripción sobre la idempotencia fue vaga , lo que deja espacio para todos estos debates. Pero esas especificaciones han sido reemplazadas por RFC 7231. Citado de RFC 7231, sección 4.2.2 Métodos idempotentes , énfasis mío:
Entonces, está escrito en las especificaciones, la idempotencia se trata del efecto en el servidor. El primer DELETE que devuelve un 204 y luego el DELETE posterior que devuelve 404, un código de estado diferente NO hace que el DELETE sea no idempotente. Usar este argumento para justificar un retorno 204 posterior es simplemente irrelevante.
OK, entonces no se trata de idempotencia. Pero entonces una pregunta de seguimiento puede ser, ¿qué pasa si todavía elegimos usar 204 en la SUPRIMACIÓN posterior? ¿Está bien?
Buena pregunta. La motivación es comprensible: permitir que el cliente alcance el resultado deseado, sin preocuparse por el manejo de errores. Yo diría que devolver 204 en DELETE posterior, es una "mentira piadosa" del lado del servidor en gran parte inofensiva, que el lado del cliente no notará inmediatamente una diferencia. Es por eso que hay personas haciendo eso en la naturaleza y todavía funciona. Solo tenga en cuenta que dicha mentira puede considerarse semánticamente extraña, porque "GET / non-exist" devuelve 404 pero "DELETE / non-exist" da 204, en ese momento el cliente descubriría que su servicio no cumple completamente sección 6.5.4 404 no encontrado .
Pero entonces, la forma prevista insinuada por RFC 7231, es decir, devolver 404 en la ELIMINACIÓN posterior, no debería ser un problema en primer lugar. Muchos más desarrolladores optaron por hacer eso. Probablemente se deba a que cualquier cliente que implemente HTTP DELETE (o cualquier método HTTP, para el caso), no asumiría ciegamente que el resultado siempre sería exitoso 2xx. Y luego, una vez que el desarrollador comience a considerar el manejo de errores, 404 Not Found sería uno de los primeros errores que se le ocurra. En ese momento, con suerte sacaría una conclusión de que, es semánticamente seguro que una operación HTTP DELETE ignore un error 404. Problema resuelto.
fuente