web-dev-qa-db-fra.com

Supprimer plusieurs enregistrements à l'aide de REST

Quelle est la méthode REST-ful de supprimer plusieurs éléments?

Mon cas d'utilisation est que j'ai une collection Backbone dans laquelle j'ai besoin de pouvoir supprimer plusieurs éléments à la fois. Les options semblent être:

  1. Envoyez une demande DELETE pour chaque enregistrement (ce qui semble être une mauvaise idée s'il existe potentiellement des dizaines d'éléments);
  2. Envoyez un DELETE où les identifiants à supprimer sont enchaînés dans l'URL ("/ records/1; 2; 3");
  3. De manière non-REST, envoyez un objet JSON personnalisé contenant les identifiants marqués pour suppression.

Toutes les options sont moins qu'idéales.

Cela semble être une zone grise de la convention REST.

58
Donald Taylor
  1. Est un choix viable de REST, mais a évidemment les limitations que vous avez décrites.
  2. Ne fais pas ça. Cela serait interprété par les intermédiaires comme signifiant "SUPPRIMER la (seule) ressource à /records/1;2;3" - Ainsi, une réponse 2xx à ceci peut les amener à purger leur cache de /records/1;2;3; pas purger /records/1, /records/2 ou /records/3; proxy une réponse 410 pour /records/1;2;3, ou d'autres choses qui n'ont pas de sens de votre point de vue.
  3. Ce choix est préférable, et peut être effectué RESTful. Si vous créez une API et que vous souhaitez autoriser des modifications en masse des ressources, vous pouvez utiliser REST pour le faire, mais la manière dont cela n'est pas immédiatement évident pour beaucoup. Une méthode consiste à créer une ressource 'demande de changement' (par exemple, en postant un corps tel que records=[1,2,3] à /delete-requests) et interrogez la ressource créée (spécifiée par l'en-tête Location de la réponse) pour savoir si votre demande a été acceptée, rejetée, en cours ou terminée. Ceci est utile pour les opérations de longue durée. Une autre méthode consiste à envoyer une demande PATCH à la liste de ressources , /records, dont le corps contient une liste de ressources. et les actions à effectuer sur ces ressources (dans le format que vous souhaitez prendre en charge). Ceci est utile pour les opérations rapides où le code de réponse de la demande peut indiquer le résultat de l'opération.

Tout peut être réalisé en respectant les contraintes de REST, et la solution consiste généralement à transformer le "problème" en une ressource et à lui attribuer une URL.
Ainsi, les opérations par lots, telles que supprimer ici, ou publier plusieurs éléments dans une liste, ou effectuer la même modification dans une série de ressources, peuvent toutes être gérées en créant une liste "Opérations par lots" et en affichant votre nouvelle opération à elle.

N'oubliez pas que REST n'est pas le seul moyen de résoudre un problème. "REST" est juste un style architectural et vous n'avez pas à pour y adhérer (mais vous perdez certains avantages d'Internet si vous ne le faites pas). Je vous suggère de regarder cette liste de architectures d'API HTTP et de choisir celle qui vous convient. Prenez simplement conscience de ce que vous perdez si vous choisissez une autre architecture et prenez une décision éclairée en fonction de votre cas d'utilisation.

Il y a quelques mauvaises réponses à cette question sur Modèles de traitement des opérations par lots dans REST services Web? qui ont beaucoup trop de votes positifs, mais qui devraient également être lus.

69
Nicholas Shanks

Si GET /records?filteringCriteria renvoie un tableau de tous les enregistrements correspondant aux critères, alors DELETE /records?filteringCriteria pourrait supprimer tous ces enregistrements. 

Dans ce cas, la réponse à votre question serait DELETE /records?id=1&id=2&id=3.

15
Martin Ždila

J'ai autorisé le remplacement en gros d'une collection, par exemple. PUT ~/people/123/shoes où le corps est la représentation complète de la collection.

Cela fonctionne pour les petites collections d'enfants d'éléments pour lesquelles le client souhaite examiner les éléments et en éliminer certains, puis en ajouter d'autres, puis mettre à jour le serveur. Ils pourraient mettre une collection vide pour tout supprimer.

Cela signifierait que GET ~/people/123/shoes/9 resterait toujours dans le cache, même si un PUT l'a supprimé, mais il s'agit simplement d'un problème de mise en cache et qui poserait un problème si une autre personne supprimait le sabot.

Mes API de données/systèmes utilisent toujours les balises ETags, par opposition aux délais d'expiration, de sorte que le serveur est touché à chaque demande et j'ai besoin d'en-têtes de version/concurrence simultanés pour muter les données. Pour les API en lecture seule et alignées vue/rapport, j'utilise des délais d'expiration pour réduire les hits sur Origin, par exemple. un classement peut être bon pour 10 minutes.

Pour les collections beaucoup plus volumineuses, telles que ~/people, je n'ai pas tendance à avoir besoin de plusieurs suppressions, le cas d'utilisation ne se produit pas naturellement et, par conséquent, la suppression d'un seul DELETE fonctionne correctement.

À l'avenir, et avec l'expérience de la création d'API REST et des mêmes problèmes et exigences, tels que l'audit, je serais enclin à utiliser uniquement les verbes GET et POST et de concevoir des événements, par exemple. POST un événement de changement d'adresse, bien que je suppose que cela viendra avec ses propres problèmes :)

Je permettrais également aux développeurs front-end de créer leurs propres API qui consomment des API back-end plus strictes, car il existe souvent des raisons pratiques et valables côté client qui expliquent pourquoi ils n'apprécient pas les conceptions strictes d'API "Fielding zealot" REST et pour des raisons de productivité et de superposition de cache.

1
Luke Puplett

Je pense que l'API SyncStorage v1.5 de Mozilla Storage Service est un bon moyen de supprimer plusieurs enregistrements à l'aide de REST.

Supprime une collection entière.

DELETE https://<endpoint-url>/storage/<collection>

Supprime plusieurs BSO d'une collection avec une seule demande.

DELETE https://<endpoint-url>/storage/<collection>?ids=<ids>

ids: supprime les BSO de la collection dont les identifiants se trouvent dans la liste fournie séparée par des virgules. Un maximum de 100 identifiants peut être fourni.

Supprime le BSO à l'emplacement donné.

DELETE https://<endpoint-url>/storage/<collection>/<id>

http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions

1
bootsoon

Si vous souhaitez envoyer plusieurs paramètres dans la méthode HTTP DELETE de RESTAPI, comme POST, GET, PUT, essayez ceci:

DELETE /app/module/test HTTP/1.1
Host: xxx.xxx.x.xx
ACCESS-TOKEN: xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: text/plain
Cache-Control: no-cache
Postman-Token: 3eabfb52-fdb2-4b05-aefa-b2fb0c53c247

first_name=name1&last_name=name2&mobile_no=2222222222&[email protected]

chaque valeur séparée par 

& (et signe)

et Content-Type est comme suit: text/plain OR text.

Cela apparaîtra lors de l'envoi d'une demande au facteur.

et j'ai une réponse du serveur

Et ces réponses sont venues du serveur qui ressemblait à ceci sur le facteur.

Array
(
    [first_name] => name1
    [last_name] => name2
    [mobile_no] => 2222222222
    [email_id] => [email protected]
)
0
Ashish Patidar

Cela semble être une zone grise de la convention REST.

Oui, jusqu'à présent, je n'ai rencontré qu'un seul guide de conception d'API REST qui mentionne les opérations par lots (telles que la suppression par lots): le google api design guide .

Ce guide mentionne la création de méthodes "personnalisées" pouvant être associées via une ressource à l'aide de deux-points, par exemple. https://service.name/v1/some/resource/name:customVerb, il mentionne aussi explicitement les opérations par lots comme cas d'utilisation:

Une méthode personnalisée peut être associée à une ressource, une collection ou un service. Il peut prendre une requête arbitraire et renvoyer une réponse arbitraire, et prend également en charge la requête et la réponse en continu. [...] Les méthodes personnalisées doivent utiliser HTTP POST verb car il possède la sémantique la plus flexible [...] Pour les méthodes critiques en termes de performances, il peut être utile de {fournir des méthodes de traitement par lots personnalisées pour réduire le nombre de requêtes à la fois. frais généraux.

Ainsi, vous pouvez faire ce qui suit selon le guide des api de Google:

POST /api/path/to/your/collection:batchDelete

... pour supprimer un tas d'éléments de votre ressource de collection.

0
B12Toaster