web-dev-qa-db-fra.com

Comment soutenir les mises à jour partielles (PATCH) dans REST

26
prashant

Selon RFC5789 ( http://tools.ietf.org/html/rfc5789 ), c’est précisément à cela que sert PATCH:

Plusieurs applications utilisant le protocole HTTP (Hypertext Transfer Protocol) Requièrent une fonctionnalité permettant de modifier partiellement les ressources. La méthode HTTP Existante permet uniquement le remplacement complet d'un document. Cette proposition ajoute une nouvelle méthode HTTP, PATCH, permettant de modifier une ressource HTTP Existante.

La distinction entre PATCH et PUT est décrite comme suit:

La différence entre les requêtes PUT et PATCH est reflétée dans la manière Dont le serveur traite l'entité incluse pour modifier la ressource identifiée par l'URI de demande. Dans une demande PUT, l'entité incluse Est considérée comme une version modifiée de la ressource stockée sur le serveur D'origine et le client demande que la version stockée Soit remplacée. . Cependant, avec PATCH, l'entité incluse contient un ensemble D'instructions décrivant la manière dont une ressource résidant actuellement sur le serveur Origin doit être modifiée pour produire une nouvelle version.

Les limitations de POST sont également décrites:

La méthode PUT est déjà définie pour écraser une ressource Avec un nouveau corps complet et ne peut pas être réutilisée pour effectuer des modifications partielles. Sinon, les mandataires et les caches, et même les clients et les serveurs, peuvent obtenir confus quant au résultat de l'opération. POST est déjà utilisé, mais Sans interopérabilité étendue (par exemple, il n'y a pas de moyen standard pour Découvrir le support du format de patch) [...]

Je vous suggérerais de lire le RFC et de vous faire votre propre idée, mais cela me semble assez clair: les demandes PATCH doivent être traitées comme des mises à jour partielles. (NB ils ne sont PAS idempotents, contrairement à PUT.)

EDIT: comme le souligne Eugene dans les commentaires, bien que les requêtes PATCH soient "neither safe nor idempotent as defined by [RFC2616]", elles peuvent être faites de la manière suivante:

Une demande PATCH peut être émise de manière à être idempotente, , Ce qui permet également d'éviter de mauvais résultats des collisions entre deux demandes PATCH sur la même ressource dans un laps de temps similaire. .] Les collisions provenant de plusieurs requêtes PATCH peuvent être plus dangereuses que les collisions PUT car certains formats de patch doivent fonctionner à partir d'un point de base connu, sinon ils corrompront la ressource. Les clients Utilisant ce type d'application de correctif DEVRAIENT utiliser une demande conditionnelle Telle que la demande échoue si la ressource a été mise à jour Depuis le dernier accès du client à la ressource. Par exemple, le client Peut utiliser un ETag fort [RFC2616] dans un en-tête If-Match de la demande PATCH .

92
Hugo Rodger-Brown

Vous devez utiliser la méthode PATCH comme décrit dans RFC-7386 "json merge PATCH".

Par exemple. si vous voulez changer la valeur de "a" et enlever "f" dans la ressource comme:

   {
     "a": "b",
     "c": {
       "d": "e",
       "f": "g"
     }
   }

Vous pouvez y parvenir en envoyant:

       PATCH /target HTTP/1.1
       Host: example.org
       Content-Type: application/merge-patch+json

       {
         "a":"z",
         "c": {
           "f": null
         }
       }
0
TechnoPriest