Was ist die REST-vollständige Methode zum Löschen mehrerer Elemente?
Mein Anwendungsfall ist, dass ich eine Backbone-Sammlung habe, in der ich mehrere Elemente gleichzeitig löschen kann. Die Optionen scheinen zu sein:
- Senden Sie eine DELETE-Anfrage für jeden einzelnen Datensatz (was eine schlechte Idee ist, wenn möglicherweise Dutzende von Elementen vorhanden sind).
- Senden Sie ein DELETE, bei dem die zu löschenden IDs in der URL aneinandergereiht sind (dh "/ records / 1; 2; 3").
- Senden Sie auf nicht-REST-Weise ein benutzerdefiniertes JSON-Objekt, das die zum Löschen markierten IDs enthält.
Alle Optionen sind nicht ideal.
Dies scheint eine Grauzone der REST-Konvention zu sein.
api
rest
backbone.js
Donald Taylor
quelle
quelle
Antworten:
/records/1;2;3
" bedeutet. Eine 2xx-Antwort darauf kann dazu führen, dass sie ihren Cache von löschen/records/1;2;3
. nicht spülen/records/1
,/records/2
oder/records/3
; Proxy eine 410 Antwort für/records/1;2;3
oder andere Dinge, die aus Ihrer Sicht nicht sinnvoll sind.records=[1,2,3]
zu/delete-requests
) und abfragen , die erstellte Ressource (spezifiziert durch dieLocation
Header der Antwort) , um herauszufinden , ob Ihr Antrag angenommen wurde, abgelehnt, ist im Gange oder abgeschlossen hat. Dies ist nützlich für langfristige Vorgänge. Eine weitere Möglichkeit ist es , eine sendenPATCH
Anfrage an die Liste Ressource ,/records
, dessen Hauptteil eine Liste von Ressourcen und Aktionen enthält, die für diese Ressourcen ausgeführt werden sollen (in welchem Format auch immer Sie unterstützen möchten). Dies ist nützlich für schnelle Vorgänge, bei denen der Antwortcode für die Anforderung das Ergebnis des Vorgangs anzeigen kann.Alles kann erreicht werden, während die Einschränkungen von REST eingehalten werden. Normalerweise besteht die Antwort darin, das "Problem" in eine Ressource zu verwandeln und ihr eine URL zu geben.
Batch-Vorgänge wie das Löschen hier oder das POSTEN mehrerer Elemente in eine Liste oder das gleiche Bearbeiten einer Reihe von Ressourcen können alle ausgeführt werden, indem eine Liste "Batch-Vorgänge" erstellt und Ihr neuer Vorgang in diese Liste gestellt wird.
Vergessen Sie nicht, REST ist nicht der einzige Weg, um ein Problem zu lösen. „REST“ ist nur ein Architekturstil und Sie nicht haben , um sich daran zu halten (aber Sie verlieren , bestimmte Vorteile des Internet , wenn Sie dies nicht tun). Ich schlage vor, Sie sehen sich diese Liste der HTTP-API-Architekturen an und wählen die für Sie passende aus. Machen Sie sich einfach bewusst, was Sie verlieren, wenn Sie eine andere Architektur wählen, und treffen Sie eine fundierte Entscheidung basierend auf Ihrem Anwendungsfall.
Gibt es einige schlechte Antworten auf diese Frage zu Mustern für die Verarbeitung von Stapeloperationen in REST-Webdiensten? die viel zu viele positive Stimmen haben, aber auch gelesen werden sollten.
quelle
DELETE
Anfrage stellen, wird alles, was zwischen dem Anforderer und dem Server liegt, denken, dass eine einzelne Ressource unter der angegebenen URL gelöscht wird. Abfragezeichenfolgen sind undurchsichtige Teile der URL zu diesen Geräten. Es spielt also keine Rolle, wie Sie Ihre API angeben. Sie sind nicht mit diesem Wissen vertraut und können sich daher nicht anders verhalten.DELETE
Anforderung verboten ist. Tu es nicht. Wenn du das tust, werde ich deine Kinder essen. Mampf mampf Mampf.Wenn ein
GET /records?filteringCriteria
Array aller Datensätze zurückgegeben wird, die den Kriterien entsprechen,DELETE /records?filteringCriteria
können alle diese Datensätze gelöscht werden.In diesem Fall wäre die Antwort auf Ihre Frage
DELETE /records?id=1&id=2&id=3
.quelle
GET /records?id=1&id=2&id=3
bedeutet nicht "die drei Datensätze mit den IDs 1, 2 und 3 abrufen", sondern "die einzelne Ressource mit URL-Pfad / Datensätzen abrufen? id = 1 & id = 2 & id = 3", was ein Bild einer Rübe sein könnte, ein einfacher Text Dokument mit der Nummer "42" auf Chinesisch oder möglicherweise nicht vorhanden./records?id=1
und/records?id=2
werden gesendet und ihre Antworten von einem Vermittler (z. B. Ihrem Browser oder ISP) zwischengespeichert. Wenn das Internet wusste, was Ihre Anwendung damit meinte, liegt es nahe, dass eine Anfrage/records?id=1&id=2
vom Cache einfach durch Zusammenführen (irgendwie) der beiden bereits vorhandenen Ergebnisse zurückgegeben werden kann, ohne den Ursprungsserver fragen zu müssen. Das ist aber nicht möglich./records?id=1&id=2
ist möglicherweise ungültig (nur 1 ID pro Anfrage zulässig) oder gibt etwas völlig anderes zurück (eine Rübe).id[]=1&id[]=2
oderid=1&id=2
in der Abfragezeichenfolge ein Array von Werten darstellen, repräsentiert diese Abfragezeichenfolge genau das. Und ich denke, es ist äußerst üblich und empfehlenswert, dass die Abfragezeichenfolge einen Filter darstellt. Außerdem , wenn Sie für Löschungen und Aktualisierungen ermöglichen, nicht cachen nicht dieGET
Anfragen. Wenn Sie dies tun, behalten Clients den veralteten Status bei.Ich denke, Mozilla Storage Service SyncStorage API v1.5 ist eine gute Möglichkeit, mehrere Datensätze mit REST zu löschen.
Löscht eine gesamte Sammlung.
Löscht mehrere BSOs aus einer Sammlung mit einer einzigen Anforderung.
ids : Löscht BSOs aus der Sammlung, deren IDs in der durch Kommas getrennten Liste enthalten sind. Es können maximal 100 IDs angegeben werden.
Löscht das BSO an der angegebenen Stelle.
http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions
quelle
Ja, bisher bin ich nur auf einen REST-API-Entwurfsleitfaden gestoßen, in dem Stapelvorgänge (z. B. das Löschen von Stapeln) erwähnt werden: den Google API-Entwurfsleitfaden .
In diesem Handbuch erwähnt die Schaffung von „custom“ Methoden , die durch die Verwendung eines Doppelpunktes über eine Ressource zugeordnet werden können, zum Beispiel
https://service.name/v1/some/resource/name:customVerb
, sie erwähnt auch ausdrücklich Batch - Operationen als Anwendungsfall:Sie können also laut Googles API-Leitfaden Folgendes tun:
... um eine Reihe von Elementen Ihrer Sammlungsressource zu löschen.
quelle
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,
im Kapitel "Benutzerdefinierte Methode" erwähnt wurde. Aber dieGET accounts.locations.batchGet
API ist GET-Methode mit Körper. Das ist komisch. developer.google.com/my-business/reference/rest/v4/…POST
http-Methode verwendet und nur die benutzerdefinierte Methode wird benanntbatchGet
. Ich denke, Google tut es, um (a) an der Regel festzuhalten, dass alle benutzerdefinierten Methoden verwendet werden müssenPOST
(siehe meine Antwort) und (b) um es den Menschen zu erleichtern, einen "Filter" in den Körper einzufügen, damit Sie dies nicht tun müssen Escape oder Codierung des Filters wie bei Abfragezeichenfolgen. Der Nachteil ist natürlich, dass dies nicht mehr wirklich zwischengespeichert werden kann ...https://service.name/v1/some/resource/name:customVerb
ist per Definition nicht RESTful.Ich habe einen umfassenden Ersatz einer Sammlung zugelassen, z. B.
PUT ~/people/123/shoes
wenn der Körper die gesamte Sammlung darstellt.Dies funktioniert für kleine untergeordnete Sammlungen von Elementen, bei denen der Client die Elemente überprüfen und einige entfernen und andere hinzufügen und dann den Server aktualisieren möchte. Sie könnten eine leere Sammlung platzieren, um alle zu löschen.
Dies würde bedeuten
GET ~/people/123/shoes/9
, dass der Cache weiterhin im Cache verbleibt, obwohl er von einem PUT gelöscht wurde. Dies ist jedoch nur ein Caching-Problem und ein Problem, wenn eine andere Person den Schuh löscht.Meine Daten- / System-APIs verwenden im Gegensatz zu Ablaufzeiten immer ETags, sodass der Server bei jeder Anforderung getroffen wird, und ich benötige korrekte Versions- / Parallelitäts-Header, um die Daten zu mutieren. Für APIs, die schreibgeschützt sind und auf Ansicht / Bericht ausgerichtet sind, verwende ich Ablaufzeiten, um Treffer beim Ursprung zu reduzieren, z. B. kann eine Rangliste 10 Minuten lang gültig sein.
Bei viel größeren Sammlungen, wie z. B.
~/people
, muss ich nicht mehrfach löschen, der Anwendungsfall tritt normalerweise nicht auf natürliche Weise auf, sodass ein einzelnes LÖSCHEN einwandfrei funktioniert.In Zukunft und aufgrund der Erfahrung mit dem Erstellen von REST-APIs und dem Erreichen der gleichen Probleme und Anforderungen wie Audits würde ich gerne nur GET- und POST-Verben verwenden und Ereignisse entwerfen, z. B. POST, ein Ereignis zur Änderung der Adresse, obwohl ich das vermute Ich werde mit seinen eigenen Problemen kommen :)
Ich würde auch Front-End-Entwicklern erlauben, ihre eigenen APIs zu erstellen, die strengere Back-End-APIs verbrauchen, da es oft praktische, gültige clientseitige Gründe gibt, warum sie strenge "Fielding zelot" -REST-API-Designs nicht mögen, und dies für Produktivität und Produktivität Gründe für die Cache-Überlagerung.
quelle