Pourquoi ne pas METTRE HTTP permis de faire des mises à jour partielles dans une API REST?
Qui dit RESTful Api doit prendre en charge partielle des mises à jour séparément via HTTP PATCH?
Il ne semble pas avoir les avantages. Il ajoute plus de travail à mettre en œuvre sur le côté serveur et plus logique sur le côté client de décider quel genre de mise à jour à la demande.
Je me suis poser cette question dans le contexte de la création d'une API REST avec HTTP qui fournit une abstraction de données connues modèles. Exigeant PATCH pour les mises à jour partielles plutôt que de METTRE intégral ou partiel, se sent comme elle n'a pas d'avantages, mais je pourrais en être persuadé.
Liées
http://restcookbook.com/HTTP%20Methods/idempotency/ - cela implique que vous n'avez pas de contrôle sur le logiciel serveur qui peut mettre en cache les requêtes.
Quelle est la justification derrière interdisant l'accès partiel METTRE? - pas de réponse claire donné, que la référence à ce HTTP définit pour Mettre vs PATCH.
http://groups.yahoo.com/neo/groups/rest-discuss/conversations/topics/17415 - montre la division de pensées à ce sujet.
- Comment est-ce que HTTP définit pour METTRE vs PATCH pas de réponse claire?
- Parce que basé sur la RFC 2616 MIS de devrait être suffisant pour la mise à jour de la représentation d'une ressource. Aussi, RESTE utilise des méthodes HTTP, mais ne dispose pas d'une relation 1:1 avec eux et, par conséquent, est ouvert à l'interprétation.
- C'est suffisant pour le remplacement de la représentation de la ressource, pas de mise à jour de pièces et de morceaux de.
- Je crois que la clé ici est le type de média. Sérialisée de représentations comme JSON et XML peuvent être partiellement mises à jour sans perdre la totalité de la représentation. D'autres types de médias sont représentées différemment et nécessiterait le remplacement complet de maintenir la représentation complète. C'est mon observation, mais je suis encore en train de lire le sujet. Merci.
- Tout simplement parce qu'ils peuvent être ne veut pas dire que c'est l'interprétation correcte de la METTRE. À partir de la RFC:
The PUT method requests that the enclosed entity be stored under the supplied Request-URI.
cela signifie Que l'entité de gros, et pas seulement les mises à jour de ladite entité. - Voici un autre avis au sujet de pourquoi vous pourriez avoir besoin de la différence: restful-api-design.readthedocs.org/en/latest/.... Généralement, il ya une raison pour les choses, et que "le trouble obsessionnel-compulsif spec nerds" n'ont pas l'habitude de faire des règles. 🙂
- merci pour le lien
- Un cas d'utilisation pour la mise à jour partielle à l'aide de la METTRE déverrouillage d'un compte bloqué. Vous ne voulez pas que le hachage de mot de passe de fuite pour le client, ni voulez-vous la réinitialisation de mot de passe. - Posté par @Vicky Ronnen
- Il semble que la définition de la METTRE pourrait tout aussi facilement être affinée afin d'englober à la fois partielle et complète des mises à jour. Je suis toujours du mal à comprendre pourquoi une méthode entièrement nouvelle (PATCH) est préférable à ce.
Vous devez vous connecter pour publier un commentaire.
Qui le dit? Le gars qui a inventé RESTE dit:
https://twitter.com/fielding/status/275471320685367296
Tout d'abord, le RESTE est d'un style architectural, et l'un de ses principes est l'effet de levier sur le comportement standardisé du protocole sous-jacent, donc si vous souhaitez implémenter une API RESTful HTTP, vous devez suivre HTTP strictement pour être de tout repos. Vous êtes libre de ne pas le faire si vous pensez que ce n'est pas suffisant pour vos besoins, personne ne va vous maudire pour cela, mais vous ne faites pas de REPOS. Vous devrez document où et comment vous s'écartent de la norme, de la création d'un couplage fort entre le client et le serveur de mise en œuvre, le point de l'ensemble de l'aide RESTE est précisément pour éviter cela et se concentrer sur vos types de médias.
Donc, basé sur la RFC 7231, MIS de devrait être utilisé que pour le remplacement complet d'une représentation, dans un idempotent de l'opération. Le PATCH doit être utilisé pour les mises à jour partielles, qui n'ont pas à être la quantité, mais c'est un bon pour les rendre idempotent en exigeant une condition préalable ou de validation de l'état actuel avant d'appliquer la diff. Si vous avez besoin de faire non-quantité de mises à jour, partielle ou non, de l'utilisation POST. Simple. Tout le monde à l'aide de votre API qui sait comment METTRE et le PATCH fonctionne attend d'eux qu'ils travaillent de cette façon, et vous n'avez pas de document ou d'expliquer ce que les méthodes doivent faire pour une ressource donnée. Vous êtes libre de METTRE de la loi, de toute autre manière qui vous convient, mais vous aurez du document que pour vos clients, et vous aurez à trouver un autre mot à la mode pour votre API, parce que ce n'est pas de tout repos.
Garder à l'esprit que le REPOS est un style architectural porté sur l'évolution à long terme de votre API. Pour faire droit sera ajouter plus de travail aujourd'hui, mais de faire des changements plus facile et moins traumatisante plus tard. Cela ne signifie pas que le REPOS est suffisant pour tout et tout le monde. Si votre objectif est la facilité de mise en œuvre et à court terme l'utilisation, il suffit d'utiliser les méthodes que vous le souhaitez. Vous pouvez faire tout par la POSTE si vous ne voulez pas vous embêter sur les clients de choisir les bonnes méthodes.
Étendre sur la réponse existant,
PUT
est censé effectuer une mise à jour complète (écraser) de la ressource de l'état tout simplement parce que HTTP définit la méthode de cette façon. Le original RFC 2616 sur HTTP/1.1 n'est pas très explicite à ce sujet, RFC 7231 ajoute sémantique précisions:Comme indiqué dans l'autre réponse, en adhérant à la présente convention simplifie la compréhension et l'utilisation de l'Api, et il n'est pas nécessaire explicitement documenter le comportement de la méthode PUT.
Toutefois, des mises à jour partielles ne sont pas exclues en raison d'idempotence. Je trouve cela important de souligner que ces concepts sont souvent confus, même sur de nombreux StackOverflow réponses (par exemple,ici).
Idempotent le seul moyen que l'application d'une demande de l'une ou plusieurs fois les résultats dans le même effet sur le serveur. Pour citer RFC 7231 une fois de plus:
Tant qu'une mise à jour partielle ne contient que des nouvelles valeurs de la ressource de l'état et ne dépend pas des valeurs précédentes (c'est à dire que ces valeurs sont écrasées), l'exigence d'idempotence est remplie. Indépendamment de combien de fois une telle mise à jour partielle est appliquée, l'état du serveur aura toujours les valeurs spécifiées dans la demande.
Si un intermédiaire à la demande d'un autre client peut modifier une partie différente de la ressource n'est pas pertinent, parce que idempotence se réfère à la opération (c'est à dire la
PUT
méthode), et non pas l'état lui-même. Et à l'égard de l'exploitation d'une partie de l'écrasement de mise à jour de son application donne le même effet après être appliqué une fois ou plusieurs fois.Au contraire, une opération qui n'est pas la quantité dépend du courant de l'état du serveur, par conséquent, il conduit à des résultats différents en fonction du nombre de fois qu'elle est exécutée. La méthode la plus simple consiste à incrémenter un nombre (non-idempotent) vs paramètre à une valeur absolue (idempotent).
Pour les non-idempotent changements, HTTP prévoit les méthodes
POST
etPATCH
, alors quePATCH
est explicitement conçu pour effectuer des modifications à une ressource existante, alors quePOST
peut être interprété beaucoup plus librement ce qui concerne la relation de l'URI de la requête, le contenu du corps et des effets secondaires sur le serveur.Qu'est-ce que cela signifie dans la pratique? Le REPOS est un paradigma pour la mise en œuvre des Api via le protocole HTTP, une convention que beaucoup de gens ont considéré comme raisonnable, et est donc susceptible d'être adopté ou compris. Encore, il ya des controverses sur ce qui est Reposant et ce qui ne l'est pas, mais même en laissant de côté, le REPOS n'est pas la seule ou la façon de construire des Api HTTP.
Le protocole HTTP lui-même met des contraintes sur ce que vous pouvez et ne pouvez pas faire, et beaucoup d'entre eux ont une réelle incidence pratique. Par exemple, en faisant abstraction de idempotence peut entraîner des serveurs de cache de changer le nombre de demandes effectivement émises par le client, et par la suite de perturber la logique attendue par les applications. Il est donc essentiel d'être conscient des répercussions lorsqu'ils s'écartent de la norme.
Strictement RESTE conforme, il n'y a pas de solution entièrement satisfaisante pour les mises à jour partielles (certains disent même que ce besoin est seul contre le RESTE). Le problème est que
PATCH
, qui semble d'abord être faite juste pour ce but, n'est pas idempotent. Ainsi, en utilisantPATCH
pour idempotent des mises à jour partielles, vous perdez les avantages de l'idempotence (nombre arbitraire de tentatives automatiques, plus simple logique, le potentiel pour des optimisations au client, serveur et réseau). En tant que tel, vous demandez peut-être si à l'aide dePUT
est vraiment la pire idée, aussi longtemps que le comportement est clairement documentée et ne se cassent pas, parce que les utilisateurs (et intermédiaires, les nœuds du réseau) s'appuient sur un certain comportement...?Des mises à jour partielles sont autorisées par le METTRE (selon la RFC 7231 http://tools.ietf.org/html/rfc7231#section-4.3.4).
",... METTRE de la demande est définie comme le remplacement de l'état de la ressource cible." - remplacement d'une partie de l'objet fondamentalement changer l'état de il.
"Partielle, du contenu des mises à jour sont possibles en ciblant un identifiés séparément des ressources de l'état qui chevauche une partie de la plus grande ressource ..."
Selon le RFC demande suivante est valide: METTRE /ressources/123 {nom: 'le nouveau nom'}
Elle changera de nom pour la ressource spécifiée. En spécifiant l'id à l'intérieur de demande de charge utile serait incorrect (comme l'a dit de ne pas permettre des mises à jour partielles non précisées ressources).
PS: ci-Dessous est un exemple lorsqu'un PATCH est utile.
Il n'y a d'objet que le Tableau a à l'intérieur. Avec METTRE vous ne pouvez pas mettre à jour une valeur spécifique. Vous ne pourrait remplacer l'ensemble de la liste à nouveau. Avec le PATCH, vous pouvez remplacer une valeur à une autre. Avec des cartes et des objets plus complexes avantage sera encore plus grand.