Im Wiki-Artikel für REST wird angegeben, dass bei Verwendung von http://example.com/resources DELETE die gesamte Sammlung gelöscht wird.
Wenn Sie http://example.com/resources/7HOU57Y DELETE verwenden, bedeutet dies, dass Sie dieses Element löschen.
Ich mache eine WEBSITE, beachte NICHT WEBSERVICE.
Ich habe eine Liste mit 1 Kontrollkästchen für jedes Element in der Liste. Sobald ich mehrere Elemente zum Löschen ausgewählt habe, können Benutzer eine Schaltfläche mit dem Namen DELETE SELECTION drücken. Wenn der Benutzer die Taste drückt, wird ein js-Dialogfeld angezeigt, in dem der Benutzer aufgefordert wird, den Löschvorgang zu bestätigen. Wenn der Benutzer bestätigt, werden alle Elemente gelöscht.
Wie sollte ich also dafür sorgen, dass mehrere Elemente RESTFUL gelöscht werden?
HINWEIS: Derzeit verwende ich für DELETE auf einer Webseite das FORM-Tag mit POST als Aktion, füge jedoch eine _method mit dem Wert DELETE hinzu, da dies von anderen in SO angegeben wurde, wie das RESTful-Löschen für eine Webseite durchgeführt wird .
Antworten:
Ich denke, Rojocas Antwort ist die bisher beste. Eine geringfügige Abweichung kann darin bestehen, die Javascript-Bestätigung auf derselben Seite zu beseitigen und stattdessen die Auswahl zu erstellen und zu dieser umzuleiten, wobei auf dieser Seite eine Bestätigungsmeldung angezeigt wird. Mit anderen Worten:
Von:
http://example.com/resources/
mach a
POST mit einer Auswahl der IDs an:
http://example.com/resources/selections
die, wenn sie erfolgreich ist, antworten sollte mit:
HTTP / 1.1 201 erstellt und ein Standortheader an:
http://example.com/resources/selections/DF4XY7
Auf dieser Seite sehen Sie dann ein Bestätigungsfeld (Javascript), das bei Bestätigung Folgendes anfordert:
LÖSCHEN http://example.com/resources/selections/DF4XY7
die bei Erfolg antworten sollte mit: HTTP / 1.1 200 Ok (oder was auch immer für einen erfolgreichen Löschvorgang geeignet ist)
quelle
http://example.com/resources/selections/
und senden in der Nutzlast (Text) der Anfrage die Daten, für die Sie Elemente löschen möchten. Soweit ich das beurteilen kann, hindert Sie nichts daran, dies zu tun, aber ich werde immer mit "aber es ist nicht RESTfull" konfrontiert.Eine Möglichkeit besteht darin, eine Lösch- "Transaktion" zu erstellen. Sie gelangen also
POST
zuhttp://example.com/resources/deletes
einer neuen Ressource, die aus einer Liste der zu löschenden Ressourcen besteht. Dann führen Sie in Ihrer Anwendung einfach das Löschen durch. Wenn Sie den Beitrag ausführen, sollten Sie einen Speicherort Ihrer erstellten Transaktion zurückgeben, zhttp://example.com/resources/deletes/DF4XY7
. A kannGET
den Status der Transaktion (abgeschlossen oder in Bearbeitung) und / oder eine Liste der zu löschenden Ressourcen zurückgeben.quelle
Hier ist, was Amazon mit seiner S3-REST-API gemacht hat.
Individuelle Löschanforderung:
Löschen mehrerer Objekte :
Aber Facebook Graph API , Parse Server REST API und Google Drive REST API gehen jedoch noch weiter, indem Sie einzelne Vorgänge in einer Anforderung "stapeln" können.
Hier ist ein Beispiel von Parse Server.
Individuelle Löschanforderung:
Chargenanforderung:
quelle
Ich würde DELETE http://example.com/resources/id1,id2,id3,id4 oder DELETE http://example.com/resources/id1+id2+id3+id4 sagen . Da "REST ein Architekturprotokoll (...) [nicht]" ist, um diesen Wikipedia-Artikel zu zitieren, gibt es meines Erachtens keine einzige Möglichkeit, dies zu tun.
Mir ist bewusst, dass oben ohne JS mit HTML nicht möglich ist, aber ich habe das Gefühl, dass REST war:
quelle
Interessanterweise denke ich, dass die gleiche Methode für das PATCHEN mehrerer Entitäten gilt und dass wir darüber nachdenken müssen, was wir mit unserer URL, unseren Parametern und unserer REST-Methode meinen.
Alle 'foo'-Elemente zurückgeben:
[GET] api/foo
Rückgabe von 'foo'-Elementen mit Filterung nach bestimmten IDs:
[GET] api/foo?ids=3,5,9
Wobei der Sinn darin besteht, dass die URL und der Filter bestimmen, mit welchen Elementen wir es zu tun haben, und die REST-Methode (in diesem Fall "GET") sagt, was mit diesen Elementen zu tun ist.
PATCHEN Sie daher mehrere Datensätze, um sie als gelesen zu markieren
[PATCH] api/foo?ids=3,5,9
..mit den Daten foo [read] = 1
Um mehrere Datensätze zu löschen, ist dieser Endpunkt am logischsten:
[DELETE] api/foo?ids=3,5,9
Bitte haben Sie Verständnis dafür, dass ich nicht glaube, dass es dafür "Regeln" gibt - für mich macht es einfach "Sinn"
quelle
Wie die Antwort von Decent Dabbler und die Antwort von Rojocas besagen, ist es am kanonischsten, virtuelle Ressourcen zu verwenden, um eine Auswahl von Ressourcen zu löschen. Ich denke jedoch, dass dies aus REST-Sicht falsch ist, da a ausgeführt wird
DELETE http://example.com/resources/selections/DF4XY7
die Auswahlressource selbst und nicht die ausgewählten Ressourcen entfernt werden sollte.Wenn ich die Antwort von Maciej Piechotka oder die Antwort von fezfox nehme , habe ich nur einen Einwand: Es gibt eine kanonischere Möglichkeit, ein Array von IDs zu übergeben, und ich verwende den Array-Operator:
DELETE /api/resources?ids[]=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d&ids[]=7e8f9a0b-1c2d-3e4f-5a6b-7c8d9e0f1a2b
Auf diese Weise greifen Sie den Endpunkt "Sammlung löschen" an, filtern die Löschung jedoch mit einem Querystring auf die richtige Weise.
quelle
Ich hatte die gleiche Situation, um mehrere Elemente zu löschen. Das habe ich letztendlich getan. Ich habe die DELETE-Operation verwendet und die IDs der zu löschenden Elemente waren Teil des HTTP-Headers.
quelle
Da es keinen "richtigen" Weg gibt, dies zu tun, habe ich in der Vergangenheit Folgendes getan:
Senden Sie DELETE an http://example.com/something mit XML- oder JSON-codierten Daten im Body.
Wenn Sie die Anfrage erhalten, prüfen Sie, ob DELETE vorhanden ist, falls dies der Fall ist, und lesen Sie dann den Text für die zu löschenden.
quelle
A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.
von tools.ietf.org/html/rfc7231#section-4.3.5