Supprimer plusieurs enregistrements à l'aide de REPOS
Qu'est-ce que le REST-ful moyen de la suppression de plusieurs éléments?
Mon cas d'utilisation, c'est que j'ai une épine Dorsale de la Collection dans laquelle j'ai besoin d'être en mesure de supprimer plusieurs éléments à la fois. Les options semblent être:
- Envoyer une demande de SUPPRESSION pour chaque enregistrement unique (ce qui semble être une mauvaise idée si il y a potentiellement des dizaines d'articles);
- Envoyer une demande de SUPPRESSION où les ID à supprimer sont enchaînés dans l'URL (c'est à dire, "/dossiers/1;2;3");
- Dans un non-RESTE façon, envoyez un personnalisé objet JSON contenant l'ID est marqué pour suppression.
Toutes les options sont moins qu'idéales.
Cela semble être une zone grise de la convention sur le REPOS.
- Double Possible de Reposante façon pour la suppression d'un tas d'éléments
Vous devez vous connecter pour publier un commentaire.
/records/1;2;3
” — Ainsi, une réponse 2xx à ce qui peut leur causer de purger la mémoire cache de/records/1;2;3
; pas purge/records/1
,/records/2
ou/records/3
; proxy un 410 réponse pour/records/1;2;3
, ou d'autres choses qui ne font pas de sens à partir de votre point de vue.records=[1,2,3]
à/delete-requests
) et sondage à la création de la ressource (spécifiée par leLocation
en-tête de la réponse) pour savoir si votre demande a été acceptée, rejetée, est en cours ou terminée. Ceci est utile pour des opérations de longue durée. Une autre façon est de envoyer unPATCH
demande à la liste des ressources,/records
, dont le corps contient une liste de ressources et d'actions à effectuer sur ces ressources (quel que soit le format que vous voulez à l'appui). Ceci est utile pour des rapide des opérations où le code de réponse pour la demande peut indiquer le résultat de l'opération.Tout ce qui peut être réalisé alors que dans le respect des contraintes de REPOS, et, habituellement, la réponse est de faire le "problème" dans une ressource, et de lui donner une URL.
Ainsi, les opérations par lots, telles que la suppression d'ici, ou de Poster à plusieurs éléments d'une liste, ou de faire la même modification à un éventail de ressources, peut être géré par la création d'un "traitement par lots" liste " et l'Affichage de votre nouvelle opération pour elle.
N'oubliez pas, le REPOS n'est pas la seule façon de résoudre n'importe quel problème. “RESTE” est juste un style architectural et vous n'avez pas ont d'y adhérer (mais vous allez perdre certains avantages de l'internet si vous n'avez pas). Je vous suggère de regarder en bas de cette liste de L'API HTTP architectures et de choisir celle qui vous convient. Juste faire de vous conscient de ce que vous perdez si vous choisissez un autre type d'architecture, et de prendre une décision éclairée en fonction de votre cas d'utilisation.
Il y a des mauvaises réponses à cette question sur Modèles pour le traitement des opérations par lots dans les services web REST? qui ont beaucoup trop de upvotes, mais doit être lu.
DELETE /records/1;2;3
ou tout ce qui est unique ou multiple supprimer l'événement.DELETE /records?id=1;2;3;4&multi=1
par exemple?DELETE
demande, ce qui se trouve entre la requestee et le serveur pense que d'une seule ressource, à l'URL spécifiée, est supprimé. Les chaînes de requête sont parties opaques de l'URL de ces appareils, de sorte qu'il n'a pas d'importance comment vous spécifiez votre API, ils ne sont pas au courant de cette connaissance ne peut donc pas se comporter différemment.DELETE
demande est interdite. Ne pas le faire. Si vous le faites, je vais manger à vos enfants. Nom Nom nom.DELETE
demande est interdite" @NicholasShanksSi
GET /records?filteringCriteria
retourne un tableau de tous les enregistrements qui correspondent 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
.GET /records?id=1&id=2&id=3
n' pas signifie “obtenir les trois enregistrements avec l'Id 1, 2 & 3”, il signifie “obtenir la seule ressource avec chemin d'accès d'URL /dossiers?id=1&id=2&id=3”, qui pourrait être une image d'un navet, un simple document texte contenant le nombre "42" en chinois, ou ne peut pas exister./records?id=1
et/records?id=2
sont envoyés, et leurs réponses mises en cache par certaines intermédiaire (par exemple, votre navigateur ou de votre FAI). Si l'internet savais ce que votre demande de dire par cela, alors il va de soi qu'une demande de/records?id=1&id=2
pourrait être retournés par le cache simplement par la fusion (en quelque sorte) les deux résultats, il l'a déjà fait, sans avoir à demander au serveur d'origine. Mais ce n'est pas possible./records?id=1&id=2
peut-être pas valide (seulement 1 ID autorisés par la demande) ou peut-être 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, que la chaîne de requête ne représentent à peine que. Et je pense qu'il est extrêmement commun, & bonne pratique d'avoir la chaîne de requête représentent un filtre. En outre, si vous le permettez pour les suppressions et mises à jour, ne pas mettre en cache lesGET
demandes. Si vous le faites, les clients tiendra vicié de l'état.GET api/records/1
pourrait renvoyer une image d'un navet, mais si nous disons qu'il doit retourner une représentation JSON d'un "record" de l'objet, les clients peuvent s'attendre à ce que. UnDELETE
demande avec une chaîne de requête n'est pas pour pour représenter supprimer les enregistrements qui correspondent à un filtre, mais cela ne signifie pas qu'il ne peut pas / ne devrait pas. Cette approche d'atteindre le résultat souhaité sans casser Reposant contraintes, donc je pense que c'est une bonne solution.x-method-override
en-tête et au lieuPOST
la demande avecx-www-form-urlencoded
si ce problème peut survenir. Seulement quelques centaines de id peut causer des problèmes!Je pense que Mozilla Service de Stockage SyncStorage API v1.5 est un bon moyen pour supprimer plusieurs enregistrements à l'aide de REPOS.
Supprime un ensemble de la collection.
Supprime plusieurs Asf à partir d'une collection avec une seule requête.
id: supprime les Asf de la collection dont les id qui sont dans la liste séparée par des virgules. Un maximum de 100 ids peuvent être fournis.
Supprime l'ASF à l'emplacement donné.
http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions
Oui, pour l'instant j'ai seulement trouvé une API REST guide de conception qui mentionne les opérations par lots (tel qu'un lot de suppression): le l'api google guide de conception.
Ce guide mentions la création de la "coutume" des méthodes qui peuvent être associés par l'intermédiaire d'une ressource à l'aide d'une virgule, par exemple
https://service.name/v1/some/resource/name:customVerb
, il mentionne aussi explicitement les opérations par lots comme des cas d'utilisation:De sorte que vous pouvez effectuer les opérations suivantes selon api google guide:
...pour supprimer un groupe d'éléments de votre collection de ressources.
Que j'ai laissé pour un commerce de gros de remplacement d'une collection, par exemple
PUT ~/people/123/shoes
où le corps est l'ensemble de la collection de la représentation.Cela fonctionne pour les petits enfants des collections d'articles où le client veut examiner un les éléments et taillez-certaines et d'en ajouter quelques autres, puis mettre à jour le serveur. Ils pourraient METTRE un regroupement vide pour supprimer tous.
Cela signifierait
GET ~/people/123/shoes/9
serait toujours dans le cache, même si une suppression, mais c'est juste un problème de mise en cache et ce serait un problème si une autre personne supprimé la chaussure.Mes données/systèmes Api de toujours utiliser les ETags par opposition à l'expiration du temps afin que le serveur est frappé sur chaque demande, et j'ai besoin de corriger la version du/la simultanéité des en-têtes de muter les données. Pour les Api qui sont en lecture seule et vue/rapport aligné, j'utilise de temps d'expiration pour réduire les coups sur l'origine, par exemple, un classement peut être bon pour 10 minutes.
Pour beaucoup de grandes collections, comme
~/people
, j'ai tendance à ne pas avoir besoin de plusieurs supprimer, le cas d'utilisation a tendance à ne pas découlent naturellement et de manière simple DELETE fonctionne très bien.À l'avenir, et avec l'expérience de la construction des Api REST et frapper les mêmes problèmes et les exigences, telles que l'audit, je serais enclin à utiliser uniquement des verbes GET et POST et de design autour d'événements, p. ex. après un changement d'adresse de l'événement, bien que je soupçonne que vais venir avec son propre ensemble de problèmes 🙂
Je voudrais aussi permettre avant la fin de l'devs pour construire leur propre Api qui consomment plus strictes back-end Api puisqu'il est souvent pratique, valide côté client raisons pourquoi ils n'aiment pas stricte, "mise en service zélote" API REST de design, et pour la productivité et le cache de la superposition des raisons.
Si vous voulez envoyer plus d'un paramètre dans la Méthode HTTP DELETE de RESTAPI comme POST, GET, PUT alors essayez ceci :
chaque valeur séparés par des
Il apparaîtra dans l'envoi d'une demande au facteur.
et j'ai reçu la réponse du serveur comme
Et ces réponses sont parvenues à partir du serveur qui ressemblait à ça sur le facteur.