Tal vez tarde en el juego, pero me topé con este problema de semántica al intentar hacer una API REST.
Para ampliar un poco la respuesta de Wrikken, creo que podría usar cualquiera 409 Conflict
o 403 Forbidden
dependiendo de la situación; en resumen, use un error 403 cuando el usuario no puede hacer absolutamente nada para resolver el conflicto y completar la solicitud (por ejemplo, no puede enviar un DELETE
solicitud para eliminar explícitamente el recurso), o use 409 si algo podría hacerse.
El servidor entendió la solicitud, pero se niega a cumplirla. La autorización no ayudará y la solicitud NO DEBE repetirse. Si el método de solicitud no era HEAD y el servidor desea hacer público el motivo por el cual la solicitud no se ha cumplido, DEBERÍA describir el motivo del rechazo en la entidad. Si el servidor no desea que esta información esté disponible para el cliente, se puede usar el código de estado 404 (No encontrado).
Hoy en día, alguien dice "403" y me viene a la mente un problema de permisos o autenticación, pero la especificación dice que es básicamente el servidor que le dice al cliente que no lo va a hacer, no lo pregunte nuevamente, y esta es la razón por la cual el cliente no debería 't.
En cuanto a PUT
vs. POST
... POST
debe usarse para crear una nueva instancia de un recurso cuando el usuario no tiene medios para o no debe crear un identificador para el recurso. PUT
se usa cuando se conoce la identidad del recurso.
...
La diferencia fundamental entre las solicitudes POST y PUT se refleja en el significado diferente del Request-URI. El URI en una solicitud POST identifica el recurso que manejará la entidad adjunta. Ese recurso podría ser un proceso de aceptación de datos, una puerta de enlace a algún otro protocolo o una entidad separada que acepte anotaciones. Por el contrario, el URI en una solicitud PUT identifica la entidad adjunta a la solicitud: el agente de usuario sabe a qué se destina el URI y el servidor NO DEBE intentar aplicar la solicitud a otro recurso. Si el servidor desea que la solicitud se aplique a un URI diferente,
DEBE enviar una respuesta 301 (movida permanentemente); el agente de usuario PUEDE tomar su propia decisión con respecto a redirigir o no la solicitud.