Mettre à jour une propriété unique dans une API REST
Dans la conception d'une nouvelle API, nous faisons de notre mieux pour suivre les schémas établis par le REPOS. La question que je me pose est la meilleure méthode à suivre lorsque vous essayez de mettre à jour une propriété unique. Par exemple:
Imaginez que vous avez une simple Voiture de ressources:
{
"make": "Chevrolet",
"model": "Chevelle",
"year": 1966,
"color": "black",
"for_sale": true
}
Supposons que la propriété for_sale
est quelque chose que vous pensez sera mis à jour régulièrement par l'utilisateur. J'ai deux options:
-
PUT
la totalité de la ressource avecfor_sale
ensemble defalse
. Pour une taille raisonnable des ressources, cela semble bien, cependant, dans la plupart des cas, nos ressources sont assez grandes, d'un lot de déchets dans l'envoi de la totalité de la ressource pour mettre à jour un seul, souvent changé de propriété. -
POST
et de faire une mise à jour partielle en n'incluant l'élément à mettre à jour, tels que:
{"for_sale":false}
C'est mieux car il nécessite beaucoup moins de frais généraux.
Mais j'ai en quelque sorte semblent être atteint pour quelque chose d'encore plus simple, mais je ne semble pas trouver la bonne approche. Il serait très pratique de proposer un simple PUT
à une URL (qui ne nécessite pas de corps de la requête) pour mettre à jour cette propriété. Je vois ce que Google est en train de faire dans leur API pour accomplir cela, mais il se sent juste un peu RPC-ish, bien que j'aime la simplicité.
POST
/blogs/blogId/posts/postId/comments/commentId/approve
(marques d'un commentaire comme non spam)
POST
/blogs/blogId/posts/postId/comments/commentId/spam
(marques un commentaire comme spam)
Quelqu'un peut-il offrir quelques conseils sur la meilleure façon d'aborder la mise à jour d'une propriété unique dans un cadre de ressources (de préférence dans un léger manière) qui a suivi, RESTE principes? Merci!!!!
Vous devez vous connecter pour publier un commentaire.
Effectivement, je pense que le PATCH méthode est conçue spécifiquement pour cet usage. Vous devriez l'utiliser pour fournir une mise à jour partielle de l'objet, plutôt que d'une mise à jour complète. Voici une entrée de blog qui explique cela plus en détail.
Comme vous l'avez mentionné, qui est :
PUT
la totalité de la ressource avec for_sale définie sur false. Pour une taille raisonnable des ressources, cela semble bien, cependant, dans la plupart des cas, nos ressources sont assez grandes, d'un lot de déchets dans l'envoi de la totalité de la ressource pour mettre à jour un seul, souvent changé de propriété.Qui est vrai, donc pour ce genre de scénarios, je suggère la démarche suivante :
L'URI doit être quelque chose comme ceci :
POST /api/cars/C1234
Request Body:
{"for_sale":false}
Que pas tous les serveurs web (et oublier les clients) soutien
PATCH
alors, les gens ont été supportant à la fois les mises à jour partielles avec POST:Ce n'est pas parfait API RESTful design, mais j'ai vu et suivi celui-ci en tant que meilleure pratique.
POST
De l'OMI n'est pas conçu pour une mise à jour à tous. C'est bon pour la création des choses et de l'envoi de certains RPC, DDD commandes de style comme/api/cars/1/sell
. Votre solution ressemble plus à un hack.