REST-modifier une partie de la ressource-PUT ou POST

je vois une bonne partie de main-saluant sur le sujet de la façon de mettre à jour seulement une partie d'une ressource (par exemple. indicateur d'état) utilisant le repos.

Les options semblent être:

  1. se plaindre que HTTP N'a pas de PATCH ou de commande de modification. Toutefois, la réponse acceptée sur HTTP modifier le verbe pour le repos? fait un bon travail de montrer pourquoi ce n'est pas une bonne idée que cela puisse paraître.

  2. utilisez POST avec les paramètres et identifiez un méthode (par exemple. un paramètre nommé "action"). Certaines suggestions sont de spécifier un en-tête X-HTTP-Method-Override avec un nom de méthode auto-défini. Cela semble conduire à la laideur de changer dans l'implémentation basée sur ce que vous essayez de faire, et d'être ouvert à la critique de ne pas être une façon particulièrement reposante d'utiliser le POST. En fait, cette approche commence à ressembler à une interface de type RPC.

  3. utiliser mis pour SUR-écrire une sous-ressource de la ressource qui représente l'attribut spécifique(s) à mettre à jour. En fait, il s'agit effectivement d'une écriture de la sous-ressource, ce qui semble conforme à l'esprit de METTRE.

à ce stade, je vois la troisième option comme la plus raisonnable.

S'agit-il d'une pratique exemplaire ou d'un modèle anti-modèle? Existe-il d'autres options?

15
demandé sur Community 2010-02-05 18:41:29

5 réponses

L'Option 3 (mise sur une sous-ressource séparée) est votre meilleure option en ce moment, et il ne serait pas nécessairement "erroné" d'utiliser simplement POST sur la ressource principale elle - même-bien que vous puissiez être en désaccord avec cela en fonction de la pédantisme que vous voulez être à ce sujet.

Bâton avec 3 et à l'utilisation plus granulaire sous-ressources, et si vraiment vous avez un besoin de PATCH-comme le comportement - l'utilisation de la POSTE. Personnellement, je vais toujours utiliser cette approche, même si PATCH ne se termine réellement comme un viable option.

5
répondu Mike 2010-02-09 01:41:52

il y a deux façons de voir une mise à jour.

  1. mise à Jour d'une chose. C'est un PUT. Option 3

  2. ajout d'une entrée supplémentaire dans l'historique de la chose. L'élément de la liste dans cette séquence d'entrées de journal est l'état actuel. C'est un POST. Option 2.

si vous êtes un type de stockage de données ou de programmation fonctionnelle, vous avez tendance à être méfiant des changements de statut, et aimez poster un nouveau morceau de fait historique statique, immuable chose. Cela impose de distinguer la chose de l'histoire de la chose, ce qui conduit à deux tables.

sinon, une "mise à jour" pour modifier le statut d'une chose ne vous dérange pas et vous êtes content d'un PUT. Cela ne fait pas de distinction entre la chose et son histoire, et garde tout dans une table.

personnellement, je trouve que je suis de moins en moins sûr des objets mutables et des PUT (sauf pour "correction d'erreur"). (Et même alors, je pense que l'ancienne chose peut être laissée en place et la nouvelle chose ajoutée avec une référence à la version précédente de lui-même.)

S'il y a un changement de statut, je pense qu'il devrait y avoir un journal de statut ou un historique et il devrait y avoir un POST pour ajouter une nouvelle entrée à cet historique. Il peut y avoir une certaine optimisation pour refléter le statut "courant" dans l'objet auquel cela s'applique, mais c'est juste une optimisation en coulisse.

7
répondu S.Lott 2010-02-05 15:59:12

HTTP avoir une commande PATCH. Elle est définie dans Section 19.6.1.1 of RFC 2068, et a été mis à jour dans projet-dusseault-http-patch-16, actuellement en attente d' publication de la RFC.

5
répondu Julian Reschke 2010-02-05 16:13:01

C'est ok pour la POSTE et l'émulation de PATCH où non disponible



Avant d'expliquer cela, il est probablement intéressant de mentionner qu'il n'y a rien de mal à utiliser POST pour faire des mises à jour Générales (voir ici):

le POST ne devient un problème que lorsqu'il est utilisé dans une situation pour laquelle une autre méthode est idéale: par exemple, récupération de l'information qui devrait être une représentation d'une ressource (GET), remplacement complet de la représentation (METTRE)

nous devrions vraiment utiliser PATCH pour faire de petites mises à jour de ressources complexes, mais il n'est pas aussi largement disponible que nous le souhaiterions. Nous pouvons émuler PATCH en utilisant un attribut supplémentaire comme partie d'un POST.

notre service doit être ouvert aux produits tiers tels que SAP, Flex, Silverlight, Excel, etc. Cela signifie que nous devons utiliser la technologie du plus petit dénominateur commun - pendant un certain temps, nous n'avons pas été en mesure D'utiliser PUT parce que seulement obtenir et POST ont été pris en charge dans toutes les technologies client.

L'approche que j'ai passé avec est d'avoir un "_method=patch" dans le cadre d'une requête POST. Les avantages sont:

(a) C'est facile à traiter avec du côté du serveur - nous faisons essentiellement semblant que le PATCH est disponible

(b) indique à des tiers que nous ne violons pas REST mais en contournant une limitation avec le navigateur. Il est également compatible avec la façon dont mis a été traitée a quelques années par la communauté Rails doit donc être compréhensible par beaucoup

facile à remplacer quand PATCH devient plus largement disponible

(d) C'est un pragmatique réponse à un problème délicat.

1
répondu Chris McCauley 2010-02-07 09:39:56

PATCH est bien pour l' patch ou diff formats. Jusqu'alors il n'est pas très utile à tous.

Comme pour votre solution 2 avec une méthode personnalisée, que ce soit dans la demande ou dans les en-têtes, non non non non et non, c'est terrible :)

seulement deux façons qui sont valides sont soit de mettre toute la ressource, avec les sous-données modifiées, ou de poster à cette ressource, ou de mettre à une sous-ressource.

tout dépend de la granularité de vos ressources conséquences prévues sur la mise en cache.

1
répondu SerialSeb 2010-02-08 08:33:02