Al diseñar una API, nos encontramos con la pregunta de si una carga útil PUT debe contener la ID del recurso que se está actualizando.
Esto es lo que tenemos actualmente:
PUT /users/123 Payload: {name: "Adrian"}
Nuestro código de ruta extrae la ID del URI y continúa con la actualización.
Los primeros usuarios de nuestra API se preguntan por qué no permitimos ID en la carga útil:
PUT /users/123 Payload: {id: 123, name: "Adrian"}
La razón por la que no lo permitimos es porque la ID está duplicada, en la carga útil y el URI.
Pensando en esto un poco más, estamos acoplando el recurso al URI.
Si el URI no tiene la ID, se deberá modificar la carga útil:
PUT /no/id/here Payload: {name: "Adrian"} < What user???
¿Hay alguna razón para no hacerlo?
/users
(no es necesario agregar 'nuevo').La respuesta a esta pregunta depende de si desea permitir que el cliente cambie la identificación.
Si el cliente puede cambiar la ID, a través de un PUT, entonces el URI para el recurso cambiará, y debe proporcionar un 301 Moved Permanently cada vez que un recurso acceda al viejo URI.
Entonces, por ejemplo, comienzas con un recurso en
y el cliente pone lo siguiente en el recurso
el recurso ha sido actualizado y su URI es ahora
El
Location
campo en la respuesta PUT debe contener el nuevo URI, y si va a/users/123
, debe obtener una301
respuesta con el campo Ubicación apuntando al nuevo/users/222
recurso.En la mayoría de los casos, aunque en realidad no desea que el cliente pueda cambiar la ID, ya que esto puede volverse bastante desordenado con bastante rapidez. En ese caso, la ID es algo que solo el servidor puede cambiar, y debe dejarla fuera del cuerpo PUT, ya que el cliente no puede actualizar este estado.
Si PONE un requerimiento a un URI diferente en el mismo recurso, diga
entonces, si ese recurso no existe, el servidor debería crearlo y crear una ID cuando lo esté haciendo
fuente