it-swarm.com.de

Löschen Sie mehrere Datensätze mit REST

Was ist die REST-Methode, um mehrere Elemente zu löschen?

Mein Anwendungsfall ist, dass ich eine Backbone-Sammlung habe, bei der ich mehrere Objekte gleichzeitig löschen muss. Die Optionen scheinen zu sein:

  1. Senden Sie eine DELETE-Anforderung für jeden einzelnen Datensatz (was bei einer Vielzahl von Elementen möglicherweise eine schlechte Idee ist).
  2. Senden Sie ein DELETE, bei dem die zu löschenden IDs in der URL zusammengefasst sind (d. H. "/ Records/1; 2; 3");
  3. Senden Sie ein benutzerdefiniertes JSON-Objekt, dessen IDs zum Löschen markiert sind.

Alle Optionen sind nicht ideal.

Dies scheint eine graue Fläche der REST - Konvention zu sein.

58
Donald Taylor
  1. Ist eine realisierbare RESTful-Wahl, hat aber offensichtlich die von Ihnen beschriebenen Einschränkungen.
  2. Mach das nicht. Es würde von Intermediären so ausgelegt, dass es "DELETE the (single) resource at /records/1;2;3" bedeutet. Eine 2xx-Antwort darauf kann sie veranlassen, ihren Cache von /records/1;2;3 zu leeren. nicht ​​lösche /records/1, /records/2 oder /records/3; Proxy eine 410-Antwort für /records/1;2;3 oder andere Dinge, die aus Ihrer Sicht keinen Sinn ergeben.
  3. Diese Auswahl ist am besten und kann mit REST durchgeführt werden. Wenn Sie eine API erstellen und Massenänderungen an Ressourcen zulassen möchten, können Sie REST verwenden, aber genau das ist vielen nicht sofort klar. Eine Methode besteht darin, eine 'Änderungsanforderungs'-Ressource zu erstellen (z. B. indem ein Text wie records=[1,2,3] an /delete-requests gesendet wird) und die erstellte Ressource (angegeben durch den Header Location von) abzufragen die Antwort), um herauszufinden, ob Ihre Anfrage angenommen, abgelehnt, bearbeitet oder abgeschlossen wurde. Dies ist nützlich für lange Betriebszeiten. Eine andere Möglichkeit besteht darin, eine PATCH-Anforderung an die Listenressource zu senden, /records, deren Hauptteil eine Liste der Ressourcen und Aktionen enthält, die für diese Ressourcen ausgeführt werden sollen (in dem von Ihnen gewünschten Format) ). Dies ist nützlich für schnelle Operationen, bei denen der Antwortcode für die Anforderung das Ergebnis der Operation anzeigen kann.

Alles kann erreicht werden, während die Einschränkungen von REST eingehalten werden. In der Regel lautet die Antwort, das "Problem" zu einer Ressource zu machen und ihm eine URL zuzuweisen.
Batch-Vorgänge, z. B. das Löschen hier oder das POSTEN mehrerer Elemente in einer Liste oder das gleiche Bearbeiten einer Reihe von Ressourcen, können durch Erstellen einer Liste mit Batch-Vorgängen und das POSTEN Ihres neuen Elements ausgeführt werden Bedienung dazu.

Vergiss nicht, REST ist nicht der einzige Weg, ein Problem zu lösen. "REST" ist nur ein architektonischer Stil, und Sie müssen nicht daran festhalten (aber Sie verlieren bestimmte Vorteile des Internets, wenn Sie dies nicht tun). Ich schlage vor, dass Sie diese Liste von HTTP-API-Architekturen durchsehen und diejenige auswählen, die zu Ihnen passt. Machen Sie sich einfach bewusst, worauf Sie verzichten, wenn Sie sich für eine andere Architektur entscheiden, und treffen Sie eine fundierte Entscheidung basierend auf Ihrem Anwendungsfall.

Es gibt einige schlechte Antworten auf diese Frage zu Muster für die Behandlung von Batch-Operationen in REST Webservices? , die viel zu viele positive Stimmen haben, aber auch gelesen werden sollten.

69
Nicholas Shanks

Wenn GET /records?filteringCriteria ein Array aller Datensätze zurückgibt, die den Kriterien entsprechen, könnte DELETE /records?filteringCriteria alle diese Datensätze löschen. 

In diesem Fall wäre die Antwort auf Ihre Frage DELETE /records?id=1&id=2&id=3.

15
Martin Ždila

Ich habe es erlaubt, eine Sammlung zu ersetzen, z. PUT ~/people/123/shoes wobei der Hauptteil die gesamte Sammlungsdarstellung ist.

Dies funktioniert für kleine untergeordnete Sammlungen von Elementen, bei denen der Client die Elemente überprüfen und einige löschen sowie andere hinzufügen und den Server aktualisieren soll. Sie könnten eine leere Sammlung setzen, um alle zu löschen.

Dies würde bedeuten, dass GET ~/people/123/shoes/9 immer noch im Cache verbleibt, obwohl ein PUT ihn gelöscht hat. Dies ist jedoch nur ein Caching-Problem und wäre ein Problem, wenn eine andere Person den Schuh löscht.

Meine Daten-/System-APIs verwenden immer ETags im Gegensatz zu Ablaufzeiten, sodass der Server bei jeder Anforderung getroffen wird. Ich benötige korrekte Versions-/Parallelitätsheader, um die Daten zu mutieren. Für APIs, die schreibgeschützt sind und die Ansicht/Bericht ausgerichtet sind, verwende ich Ablaufzeiten, um die Treffer auf Origin zu reduzieren, z. Eine Bestenliste kann für 10 Minuten gut sein.

Bei viel größeren Sammlungen, wie ~/people, neige ich dazu, nicht mehrmals zu löschen, der Anwendungsfall neigt dazu, von Natur aus nicht aufzutreten, und so funktioniert ein einzelnes DELETE gut.

In der Zukunft und aufgrund der Erfahrung mit dem Erstellen von REST - APIs und den gleichen Problemen und Anforderungen, wie beispielsweise beim Audit, würde ich gerne nur GET- und POST - Verben und Design für Ereignisse verwenden, z. POST ein Adressänderungsereignis, obwohl ich vermute, dass dies mit seinen eigenen Problemen einhergeht :)

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, aus denen sie strikte API-Designs "Fielding zealot" REST nicht mögen. und aus Gründen der Produktivität und des Cache-Layerings.

1
Luke Puplett

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.

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

Löscht mehrere BSOs mit einer einzigen Anforderung aus einer Sammlung.

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

ids: löscht BSOs aus der Auflistung, deren ids in der angegebenen, durch Kommas getrennten Liste enthalten sind. Es können maximal 100 ids angegeben werden.

Löscht das BSO am angegebenen Ort.

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

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

1
bootsoon

Wenn Sie mehr als einen Parameter in der DELETE-HTTP-Methode von RESTAPI wie POST, GET, PUT senden möchten, versuchen Sie Folgendes:

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]

jeder Wert getrennt durch 

& (und unterschreiben)

und Inhaltstyp ist text/plain OR text wie Sie möchten.

Dies erscheint beim Senden einer Anfrage an den Postboten.

und ich habe Antwort vom Server als erhalten

Und diese Antworten kamen vom Server, der auf dem Postboten so aussah.

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

Dies scheint eine graue Fläche der REST - Konvention zu sein.

Ja, bisher bin ich nur über einen API-Designleitfaden REST gekommen, in dem Batch-Vorgänge (z. B. Batch-Delete) erwähnt werden: Der google-API-Design-Guide .

Dieses Handbuch erwähnt die Erstellung von "benutzerdefinierten" Methoden, die über eine Ressource mithilfe eines Doppelpunkts verknüpft werden können, z. https://service.name/v1/some/resource/name:customVerb erwähnt auch Batch-Operationen explizit als Anwendungsfall:

Eine benutzerdefinierte Methode kann einer Ressource, einer Sammlung oder einem Service zugeordnet werden. Es kann eine willkürliche Anforderung annehmen und eine beliebige Antwort zurückgeben. Außerdem werden Streaming-Anforderung und -Antwort unterstützt. Benutzerdefinierte Methoden sollten das HTTP POST - Verb verwenden, da es über die flexibelste Semantik verfügt. Für leistungskritische Methoden kann es nützlich sein, benutzerdefinierte Stapelmethoden bereitzustellen, um den Aufwand pro Anforderung zu reduzieren.

So können Sie gemäß der API-Anleitung von Google Folgendes tun:

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

... um ein paar Elemente Ihrer Sammlungsressource zu löschen.

0
B12Toaster