En concevant une API, nous nous sommes heurtés à la question de savoir si une charge utile PUT doit contenir l'ID de la ressource mise à jour.
Voici ce que nous avons actuellement:
PUT /users/123 Payload: {name: "Adrian"}
Notre code d'itinéraire extrait l'ID de l'URI et continue la mise à jour.
Les premiers utilisateurs de notre API se demandent pourquoi nous n'autorisons pas l'ID dans la charge utile:
PUT /users/123 Payload: {id: 123, name: "Adrian"}
La raison pour laquelle nous ne l'avons pas autorisé est que l'ID est dupliqué, dans la charge utile et l'URI.
En y réfléchissant un peu plus, nous couplons la ressource à l'URI.
Si l'URI n'a pas l'ID, la charge utile devra être modifiée:
PUT /no/id/here Payload: {name: "Adrian"} < What user???
Y a-t-il des raisons de ne pas le faire?
/users
(pas besoin d'ajouter «nouveau»).La réponse à cette question dépend de si vous souhaitez autoriser le client à modifier l'ID?
Si le client peut modifier l'ID, via un PUT, l'URI de la ressource changera et vous devez fournir un 301 déplacé de façon permanente à chaque fois qu'une ressource accède à l'ancien URI.
Ainsi, par exemple, vous commencez avec une ressource à
et le client met ce qui suit sur la ressource
la ressource a été mise à jour et son URI est maintenant
Le
Location
champ dans la réponse PUT doit contenir le nouvel URI, et si vous allez à/users/123
vous devriez obtenir une301
réponse avec le champ Emplacement pointant vers la nouvelle/users/222
ressource.Dans la plupart des cas, vous ne voulez pas que le client puisse changer l'ID, car cela peut devenir assez compliqué assez rapidement. Dans ce cas, l'ID est quelque chose que seul le serveur peut changer, et vous devez le laisser hors du corps PUT, car le client ne peut pas mettre à jour cet état.
Si vous METTRE un besoin à un URI différent sur la même ressource, dites
alors si cette ressource n'existe pas, le serveur doit la créer et créer et ID quand il le fait
la source