Puissance idem
À la suite de la RFC, un PUT devrait fournir un objet complet à la ressource. La raison principale en est que PUT devrait être idempotent. Cela signifie qu'une demande répétée doit donner le même résultat sur le serveur.
Si vous autorisez les mises à jour partielles, cela ne peut plus être idem-puissant. Si vous avez deux clients. Client A et B, le scénario suivant peut évoluer:
Le client A obtient une image à partir d'images de ressources. Ceci contient une description de l'image, qui est toujours valide. Le client B met une nouvelle image et met à jour la description en conséquence. La photo a changé. Le client A voit, il n'a pas à changer la description, car c'est comme il veut et ne met que l'image.
Cela conduira à une incohérence, les mauvaises métadonnées attachées à l'image!
Encore plus ennuyeux, tout intermédiaire peut répéter la demande. Dans le cas où il décide d'une manière ou d'une autre, le PUT a échoué.
La signification de PUT ne peut pas être changée (bien que vous puissiez en abuser).
Autres options
Heureusement, il y a une autre option, c'est PATCH. PATCH est une méthode qui vous permet de mettre à jour partiellement une structure. Vous pouvez simplement envoyer une structure partielle. Pour des applications simples, c'est très bien. Cette méthode n'est pas garantie d'être idem puissant. Le client doit envoyer une demande sous la forme suivante:
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
Et le serveur peut répondre avec 204 (pas de contenu) pour signaler le succès. En cas d'erreur, vous ne pouvez pas mettre à jour une partie de la structure. La méthode PATCH est atomique.
L'inconvénient de cette méthode est que tous les navigateurs ne la prennent pas en charge, mais qu'il s'agit de l'option la plus naturelle dans un service REST.
Exemple de demande de correctif:
http://tools.ietf.org/html/rfc5789#section-2.1
Json patcher
L'option json semble être assez complète et une option intéressante. Mais il peut être difficile à mettre en œuvre pour des tiers. Vous devez décider si votre base d'utilisateurs peut gérer cela.
Il est également un peu compliqué, car vous devez créer un petit interpréteur qui convertit les commandes en une structure partielle, que vous allez utiliser pour mettre à jour votre modèle. Cet interpréteur doit également vérifier si les commandes fournies ont un sens. Certaines commandes s'annulent. (écrivez fielda, supprimez fielda). Je pense que vous souhaitez signaler cela au client pour limiter le temps de débogage de son côté.
Mais si vous avez le temps, c'est une solution vraiment élégante. Vous devez encore valider les champs de cours. Vous pouvez combiner cela avec la méthode PATCH pour rester dans le modèle REST. Mais je pense que POST serait acceptable pour ici.
Aller mal
Si vous décidez d’utiliser l’option PUT, vous risquez un peu. Dans ce cas, vous devriez au moins ne pas supprimer l’erreur. L'utilisateur a une certaine attente (les données seront mises à jour) et si vous cassez cela, vous allez donner du temps à certains développeurs.
Vous pouvez choisir de signaler: 409 Conflict ou 403 Forbidden. Cela dépend comment vous regardez le processus de mise à jour. Si vous le voyez comme un ensemble de règles (centré sur le système), alors le conflit sera plus agréable. Quelque chose comme, ces champs ne peuvent pas être mis à jour. (En conflit avec les règles). Si vous le voyez comme un problème d’autorisation (centré sur l’utilisateur), vous devriez alors renvoyer interdit. Avec: vous n'êtes pas autorisé à modifier ces champs.
Vous devez toujours obliger les utilisateurs à envoyer tous les champs modifiables.
Une option raisonnable pour le faire est de le définir sur une sous-ressource, qui ne propose que les données modifiables.
Opinion personnelle
Personnellement, j'irais (si vous n'avez pas à travailler avec des navigateurs) pour le modèle PATCH simple, puis étendez-le plus tard avec un processeur de patch JSON. Cela peut être fait en différenciant les types MIME: Le type MIME de JSON Patch:
application / json-patch
Et json: application / json-patch
facilite sa mise en œuvre en deux phases.