Quelle est la manière REST-Ful de supprimer plusieurs éléments?
Mon cas d'utilisation est que j'ai une collection Backbone dans laquelle je dois pouvoir supprimer plusieurs éléments à la fois. Les options semblent être:
- Envoyez une demande DELETE pour chaque enregistrement (ce qui semble être une mauvaise idée s'il y a potentiellement des dizaines d'éléments);
- Envoyer un DELETE où les identifiants à supprimer sont regroupés dans l'URL (c'est-à-dire "/ records / 1; 2; 3");
- De manière non REST, envoyez un objet JSON personnalisé contenant les ID marqués pour suppression.
Toutes les options sont loin d'être idéales.
Cela semble être une zone grise de la convention REST.
api
rest
backbone.js
Donald Taylor
la source
la source
Réponses:
/records/1;2;3
» - Donc une réponse 2xx à cela peut les amener à purger leur cache de/records/1;2;3
; ne 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.records=[1,2,3]
to/delete-requests
) et à interroger la ressource créée (spécifiée par l'en-Location
tête de la réponse) pour savoir si votre demande a été acceptée, rejetée, est en cours ou a terminé. Ceci est utile pour les opérations de longue durée. Une autre méthode consiste à envoyer unePATCH
requête à la ressource de liste ,/records
, dont le corps contient une liste de ressources et d'actions à effectuer sur ces ressources (quel que soit 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 généralement la réponse est de faire du "problème" une ressource, et de lui donner une URL.
Ainsi, les opérations par lots, telles que supprimer ici, ou POSTER plusieurs éléments dans une liste, ou effectuer la même modification sur une bande de ressources, peuvent toutes être gérées en créant une liste «d'opérations par lots» et en y POSTANT votre nouvelle opération.
N'oubliez pas que REST n'est pas le seul moyen de résoudre un problème. « REST » est juste un style architectural et que vous n'avez à y adhérer (mais vous perdez certains avantages de l'Internet si vous ne le faites pas). Je vous suggère de regarder cette liste d' 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 de mauvaises réponses à cette question sur les modèles de gestion des opérations par lots dans les services Web REST? qui ont beaucoup trop de votes positifs, mais devraient être lus aussi.
la source
DELETE
demande, tout ce qui se trouve entre le demandeur et le serveur pensera qu'une seule ressource, à l'URL spécifiée, est en cours de suppression. Les chaînes de requête sont des parties opaques de l'URL de ces appareils, donc peu importe la façon dont vous spécifiez votre API, elles ne sont pas au courant de cette connaissance et ne peuvent donc pas se comporter différemment.DELETE
est interdit de transmettre un corps de requête avec une requête. Ne fais pas ça. Si vous le faites, je mangerai vos enfants. Miam miam miam.Si
GET /records?filteringCriteria
retourne un tableau de tous les enregistrements correspondant aux critères, alorsDELETE /records?filteringCriteria
pourrait supprimer tous ces enregistrements.Dans ce cas, la réponse à votre question serait
DELETE /records?id=1&id=2&id=3
.la source
GET /records?id=1&id=2&id=3
ne signifie pas "obtenir les trois enregistrements avec les ID 1, 2 et 3", cela signifie "obtenir la ressource unique avec le chemin / les enregistrements d'URL? id = 1 & id = 2 & id = 3" qui pourrait être une image d'un navet, un texte brut document contenant le numéro «42» en chinois, ou peut ne pas exister./records?id=1
et/records?id=2
sont envoyées, et leurs réponses mises en cache par un intermédiaire (par exemple votre navigateur ou votre FAI). Si Internet savait ce que votre application voulait dire par là, il va de soi qu'une demande de/records?id=1&id=2
pourrait être renvoyée par le cache simplement en fusionnant (d'une manière ou d'une autre) les deux résultats dont il dispose déjà, sans avoir à demander au serveur d'origine. Mais ce n'est pas possible./records?id=1&id=2
peut être invalide (un seul identifiant autorisé par demande) ou peut renvoyer quelque chose de complètement différent (un navet).id[]=1&id[]=2
ouid=1&id=2
dans la chaîne de requête pour représenter un tableau de valeurs, cette chaîne de requête représente exactement cela. Et je pense qu'il est extrêmement courant et bon que la chaîne de requête représente un filtre. En outre, si vous autorisez les suppressions et les mises à jour, ne mettez pas en cache lesGET
requêtes. Si vous le faites, les clients resteront périmés.Je pense que l'API Mozilla Storage Service SyncStorage v1.5 est un bon moyen de supprimer plusieurs enregistrements à l'aide de REST.
Supprime une collection entière.
Supprime plusieurs BSO d'une collection avec une seule demande.
ids : supprime les BSO de la collection dont les identifiants se trouvent dans la liste séparée par des virgules. Un maximum de 100 identifiants peut être fourni.
Supprime le BSO à l'emplacement indiqué.
http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions
la source
Oui, jusqu'à présent, je n'ai rencontré qu'un seul guide de conception d'API REST qui mentionne les opérations par lots (comme une suppression par lots): le guide de conception de l'API Google .
Ce guide mentionne la création de méthodes "personnalisées" qui peuvent être associées via une ressource en utilisant un signe deux-points, par exemple
https://service.name/v1/some/resource/name:customVerb
, il mentionne également explicitement les opérations par lots comme cas d'utilisation:Ainsi, vous pouvez faire ce qui suit selon le guide API de Google:
... pour supprimer un groupe d'éléments de votre ressource de collection.
la source
If the HTTP verb used for the custom method does not accept an HTTP request body (GET, DELETE), the HTTP configuration of such method must not use the body clause at all,
au chapitre Méthode personnalisée. Mais l'GET accounts.locations.batchGet
api est la méthode GET avec body. C'est bizarre. developer.google.com/my-business/reference/rest/v4/…POST
méthode http utilisée et seule la méthode personnalisée est nomméebatchGet
. Je suppose que Google le fait pour (a) s'en tenir à sa règle selon laquelle toutes les méthodes personnalisées doivent êtrePOST
(voir ma réponse) et (b) pour permettre aux gens de mettre plus facilement un "filtre" dans le corps afin que vous n'ayez pas à le faire échapper ou encoder le filtre comme avec les chaînes de requête. l'inconvénient, bien sûr, est que ce n'est plus vraiment cachable ...https://service.name/v1/some/resource/name:customVerb
n'est pas RESTful par définition.J'ai autorisé le remplacement en gros d'une collection, par exemple
PUT ~/people/123/shoes
où le corps est la représentation entière de la collection.Cela fonctionne pour les petites collections d'éléments enfants où le client souhaite examiner les éléments et en éliminer certains, en ajouter d'autres, puis mettre à jour le serveur. Ils pourraient METTRE une collection vide pour tout supprimer.
Cela signifierait
GET ~/people/123/shoes/9
resterait toujours dans le cache même si un PUT l'a supprimé, mais ce n'est qu'un problème de mise en cache et ce serait un problème si une autre personne supprimait la chaussure.Mes API de données / systèmes utilisent toujours des 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 corrects pour muter les données. Pour les API qui sont en lecture seule et alignées vue / rapport, j'utilise les délais d'expiration pour réduire les appels à l'origine, par exemple, un classement peut durer 10 minutes.
Pour des collections beaucoup plus volumineuses, comme
~/people
, j'ai tendance à ne pas avoir besoin de plusieurs suppressions, le cas d'utilisation a tendance à ne pas se produire naturellement et donc un seul DELETE fonctionne bien.À l'avenir, et d'après l'expérience de la création d'API REST et des mêmes problèmes et exigences, comme l'audit, je serais enclin à utiliser uniquement les verbes GET et POST et à concevoir autour d'événements, par exemple POST un événement de changement d'adresse, bien que je soupçonne que 'll viendra avec son propre ensemble de problèmes :)
J'autoriserais également les développeurs front-end à créer leurs propres API qui consomment des API back-end plus strictes, car il existe souvent des raisons pratiques et valides côté client pour lesquelles ils n'aiment pas les conceptions d'API REST strictes "Fielding zealot", et pour la productivité et raisons de la superposition du cache.
la source