REST: mise à jour de plusieurs ressources avec une requête-est-ce standard ou à éviter?

Une API REST simple:

  • OBTENIR: des articles/{id} - Retourne une description de l'élément avec l'id
  • PUT: items / {id} - met à jour ou crée l'élément avec l'id donné
  • SUPPRIMER: articles/{id} - Supprime l'élément avec l'id

Maintenant, L'extension API en question:

  • obtenir: articles?filter-renvoie tous les ID d'élément correspondant au filtre
  • PUT: items-met à jour ou crée un ensemble d'éléments comme décrit par le JSON charge utile
  • [[SUPPRIMER: articles - supprime une liste des éléments décrits par la charge utile JSON]] Pas de Corriger

Je suis maintenant intéressé par la fonctionnalité de recyclage de L'opération supprimer et mettre qui peut être facilement accessible par PUT / DELETE items / {id}.

Question: Est-il Courant de fournir une API comme celle-ci?

Alternative: à l'ère de la connexion unique plusieurs requêtes l'émission de plusieurs requêtes est bon marché et fonctionnerait plus atomique depuis un changement soit réussit ou échoue, mais à l'ère de la base de données NOSQL, un changement dans la liste peut déjà se produire même si le traitement de la demande meurt avec un serveur interne ou autre pour une raison quelconque.

[mise à JOUR]

Après avoir considéré les Standards Web de la Maison Blanche et Wikipedia: exemples REST l'exemple suivant API est maintenant proposé:

Une API REST simple:

  • GET: items / {id} - renvoie une description de l'élément avec le id
  • PUT: items / {id} - met à jour ou crée l'élément avec l'id donné
  • SUPPRIMER: articles/{id} - Supprime l'élément avec l'id

API Top-ressource:

  • obtenir: articles?filter-renvoie tous les ID d'élément correspondant au filtre
  • POST: items-met à jour ou crée un ensemble d'éléments comme décrit par la charge utile JSON

Mettre et supprimer sur / articles n'est pas pris en charge et interdit.

L'utilisation de POST semble faire l'affaire comme étant celle de créer de nouveaux éléments dans une ressource englobante sans remplacer mais en ajoutant.

La sémantique HTTP POST lit:

Extension d'une base de données par une opération d'ajout

Où les méthodes PUT nécessiteraient de remplacer la collection complète afin de renvoyer une représentation équivalente Citée par sémantique HTTP PUT :

Un PUT réussi d'une représentation donnée suggérerait qu'un GET ultérieur sur cette même ressource cible se traduira par une représentation équivalente renvoyée dans une réponse 200 (OK).

[UPDATE2]

Une alternative qui semble encore plus cohérente pour l'aspect de mise à jour de plusieurs objets semble être la méthode PATCH. La différence entre PUT et PATCH est décrite dans le Draft RFC 5789 comme étant:

La différence entre les requêtes PUT et PATCH se reflète dans la façon dont le serveur traite l'entité incluse pour modifier ressource identifiée par la requête-URI. Dans une requête 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. Avec PATCH, cependant, l'entité incluse contient un ensemble d'instructions décrivant comment une ressource résidant actuellement sur le serveur d'origine doit être modifiée pour produire une nouvelle version. La méthode PATCH affecte la ressource identifiée par L'URI de requête, et elle peut également avoir des effets secondaires sur d'autres ressources; c.-à-d., de nouvelles ressources peuvent être créées, ou des ressources existantes modifiées, par l'application d'un correctif.

Donc comparé à POST, PATCH peut être aussi une meilleure idée puisque PATCH permet une mise à jour où as POST ne permet que d'ajouter quelque chose qui signifie ajouter sans possibilité de modification.

Donc, POST semble se tromper ici et nous devons changer notre API proposée en:

Une API REST simple:

  • OBTENIR: des articles/{id}: Renvoie un description de l'élément avec l'id
  • PUT: items / {id} - met à jour ou crée l'élément avec l'id donné
  • SUPPRIMER: articles/{id} - Supprime l'élément avec l'id

API Top-ressource:

  • obtenir: articles?filter-renvoie tous les ID d'élément correspondant au filtre
  • POST: items-crée un ou plusieurs éléments comme décrit par la charge utile JSON
  • PATCH: éléments-crée ou met à jour un ou plusieurs éléments comme décrit par la charge utile JSON
31
demandé sur PatrickSteele 2015-08-19 17:31:47

2 réponses

Vous pouvez patcher la collection, par exemple

PATCH /items
[ { id: 1, name: 'foo' }, { id: 2, name: 'bar' } ]

Techniquement PATCH identifierait L'enregistrement dans L'URL (IE PATCH /items/1 et pas dans le corps de la requête, mais cela semble être une bonne solution pragmatique.

Pour prendre en charge la suppression, la création et la mise à jour en un seul appel, ce n'est pas vraiment pris en charge par les conventions REST standard. Une possibilité est un service spécial "batch" qui vous permet d'assembler des appels ensemble:

POST /batch
[
  { method: 'POST', path: '/items', body: { title: 'foo' } },
  { method: 'DELETE', path: '/items/bar' }
]

Qui renvoie une réponse avec des codes d'État pour chaque demandes intégrées:

[ 200, 403 ]

Pas vraiment standard, mais je l'ai fait et ça marche.

24
répondu mahemoff 2015-08-19 17:29:38

Pour autant que je comprenne le concept REST, il couvre une mise à jour de plusieurs ressources avec une seule requête. En fait, l'astuce ici est de supposer un conteneur autour de ces multiples ressources et de le prendre comme une seule ressource. Par exemple, vous pouvez simplement supposer que la liste des identifiants identifie une ressource qui contient plusieurs autres ressources.

Dans ces exemples dans Wikipedia ils parlent aussi de ressources au pluriel.

1
répondu Kris 2015-08-19 14:50:09