@MichaelBurr tiene razón acerca de la idempotencia y los efectos secundarios.
Mi opinión es que hay 2 estados involucrados en una determinada solicitud REST, el estado del cliente y el estado del servidor. REST tiene que ver con la transferencia de estos estados entre el servidor y el cliente, de modo que el estado del cliente se correlaciona con un subconjunto del estado del servidor, en otras palabras, el subconjunto se mantiene coherente con el servidor. Debido a esa idempotencia, esto debería significar que las solicitudes idempotentes subsiguientes no darán como resultado que ninguno de los dos estados sea diferente de lo que sería hacerlo solo una vez. Con el primer DELETE, imagina que el servidor borra el recurso y le informa al cliente que también puede eliminar el recurso (ya que el recurso "ya no existe"). Ahora ambos estados deberían ser idénticos a before con menos el elemento que se eliminó. Para que el cliente haga algo diferente cuando intenta eliminar el elemento una vez que ya ha sido eliminado, el estado que se transfiere del servidor al cliente debe contener información diferente. El servidor puede hacer las cosas de forma ligeramente diferente con la información de que el recurso ya fue eliminado, pero una vez que responde con algo diferente, la idempotencia de los métodos está esencialmente rota.
Para la función idempotente:
delete(client_state) -> client_state - {item}
delete(delete(client_state)) -> client_state - {item}
delete(client_state) = delete(delete(client_state))
La mejor manera de garantizar este idempotencia es si la respuesta del servidor es idéntico, eso significa que la única manera de que el estado del cliente para romper el idempotencia es para que haya no determinación o efectos secundarios en el manejo de la respuesta por parte del cliente (lo que probablemente apunta a una implementación incorrecta del manejo de la respuesta).
Si existe un acuerdo entre el cliente y el servidor de que los códigos de estado existen fuera de la representación del estado que se transfiere (REST), es posible informar al cliente que el elemento "ya no existe" (como lo haría en la primera solicitud) con el comentario adicional de que se había eliminado previamente. Lo que el cliente hace con esta información no está claro, pero no debería afectar el estado del cliente resultante. Pero entonces el código de estado no se puede usar para comunicar el estado, o más bien si también comunica el estado en otras situaciones (como quizás "no tienes permiso para eliminar este elemento" o "el elemento no se eliminó"), luego hay alguna ambigüedad o confusión introducida. Por lo tanto, al menos necesita una buena razón para introducir más confusión en la comunicación si quiere decir que DELETE es idempotente y aún tienen la respuesta del servidor depende de las solicitudes DELETE anteriores que son idénticas.
peticiones HTTP implican eliminar métodos, por lo que la función podría parecerse
delete(client_state) = send_delete(client_state) -> receive_delete(client_state)
-> respond_to_delete(informative_state)
-> handle_response(informative_state)
-> client_state - {item}
Con su # 2, creo que debería sacar "recientemente" la reciente eliminación no debería tener nada que ver con la estrategia de esta respuesta. –
@JeffMartin Tienes razón, fue más conversacional que real. Remoto. –