Ich habe eine Sammlung von Produkten in einer Produktgruppe, zB:
product-groups/123/products
Wenn ich der Sammlung hinzufügen muss , ist es in Ordnung, dass ich nur einige Produkte mit PUT übergebe?
Wenn ich einige Produkte aus der Sammlung löschen muss , ist es in Ordnung, dass ich Filterdaten (ein Array von IDs) mit DELETE übergebe?
Wie lässt sich die Funktionalität im Sinne von ReST am besten umsetzen?
Bearbeiten: Die Elemente sind Links zu separaten Entitäten, im Grunde IDs von Produkten.
rest
collections
user151851
quelle
quelle
Antworten:
Im Allgemeinen haben Sie einen Endpunkt, der die gesamte Sammlung von x darstellt :
Sag mal, wollen Sie ein einzelnes Produkt zu aktualisieren, Sie machen PUT zu
/products/{id}
. Wenn Sie ein einzelnes Produkt teilweise aktualisieren möchten (nicht jedes Feld aktualisieren), können Sie auch einen PATCH to verwenden/products/{id}
. Gleiches gilt für das Löschen einer einzelnen Entität ( DELETE to/products/{id}
).Wenn Sie auf eine einzelne Ressource abzielen möchten , qualifizieren Sie sich über den Pfad, welche einzelne Ressource Sie ändern möchten.
Die einzige Aktion, die das Schema bricht, ist die Erstellung einer Ressource. Wenn Sie eine Ressource erstellen, zielen Sie auf die gesamte Sammlung ab, sagen Sie POST zu
/products
.Es sollte jedoch klar sein, dass das Ziel für Operationen, die die gesamte Sammlung betreffen, zum entsprechenden Sammlungsendpunkt gehen sollte.
Wenn Sie beispielsweise eine Untergruppe roter Produkte abrufen möchten, fragen Sie nach
GET to
/products?colour=red
.Also, wenn Sie alle diese löschen möchten, Sie DELETE
/products?colour=red
. Oder wenn Sie einige Produkte über löschen möchtenid
, können Sie LÖSCHEN/products?id=1&id=2&id=3
.Was ist bulk Schaffung von Ressourcen? POST Ihre Sammlung
[{...},{...},{...}]
einfach an/products
. Gleiches gilt für PUT und PATCH .Das ist wirklich unkompliziert.
Um Ihre Fragen zu beantworten:
Es ist nicht nur in Ordnung, Sie werden auch dazu ermutigt.
Das ist in Ordnung. Wie Eneko Alonso schrieb, gibt es manchmal Massenoperationen , die über "Controller" -Endpunkte gekapselt sind , dh ein POST wird verwendet, um (komplexe) Operationen auszulösen.
quelle
PATCH
und ein vollständiger Austausch über erfolgtPUT
.Normalerweise sollen REST-Methoden auf einer einzelnen Entität / einem einzelnen Objekt (CRUD) ausgeführt werden.
Es gibt verschiedene Möglichkeiten:
Der erste folgt den REST-Standards, kann jedoch teuer sein, da Ihre Sammlungsobjekte / -entitäten sehr groß sein können (die Aktualisierung einer Gruppe mit Tausenden von Produkten, um nur ein Produkt hinzuzufügen / zu entfernen, wäre eine große Anforderung).
Die zweite Option wird von vielen APIs bevorzugt, um REST über die CRUD-Operationen hinaus zu erweitern.
Beispielsweise:
Viele APIs verwenden immer POST für diese erweiterten Operationen, aber nichts beschränkt Sie auf die Verwendung anderer http-Methoden (außer der Beschränkung von GET und DELETE, um einen leeren Textkörper zu haben).
quelle
products/collection
einen "Umschlag" von Elementen zurückgibt und den Umschlaginhalt über einen PUT ändert? Zum Beispiel: "Genau so möchte ich die Artikel in der Sammlung haben".Nur um vorherige Antworten / Kommentare zu präzisieren.
Nach meinem Wissen ist POST die Methode, um der Sammlung einzelne Elemente hinzuzufügen.
DELETE wiederum ist die Methode zum Löschen eines einzelnen Elements aus der Auflistung. Beide Szenarien sind vollkommen RUHIG.
Sie sollten jedoch den entsprechenden URI verwenden, um auf ein einzelnes Element oder die gesamte Auflistung zu verweisen.
Um beispielsweise ein Element zur Auflistung hinzuzufügen, sollten Sie die Daten in den folgenden URI POSTEN:
Um ein einzelnes Produkt aus der Sammlung zu löschen, können Sie die DELETE-Methode verwenden, um eine Anfrage an Folgendes zu senden:
Mit der PATCH-Methode können einige Elemente in der Auflistung aktualisiert werden. Zum Beispiel, wenn Sie nur ein Feld in einem Element aktualisieren müssen. Das Erstellen einer vollständigen Ressourcendarstellung für eine sehr große Sammlung kann sehr kostspielig sein.
quelle
Grundsätzlich sind alle RESTful-Operationen für eine Sammlung gültig, aber stellen Sie sicher, dass Sie verstehen, wie die Semantik der Verben für eine Sammlung gilt:
PUT ist ein vollständiger Ersatz.
/item/{id}
) und weglassenname
, sollte es gelöscht oder auf null oder etwas ähnliches gesetzt werden.Während ein PUT zum Hinzufügen von Elementen verwendet werden kann, müssen Sie "alle" Elemente senden. Das Senden "einiger" Elemente sollte zu Entfernungen führen (ich gehe davon aus, dass dies nicht das ist, was das OP wünscht).
DELETE ist intuitiver. Es ist gültig, die Sammlung oder eine gefilterte Teilmenge davon zu löschen. Nur die im Filter enthaltenen Elemente sollten betroffen sein.
PATCH ist ebenfalls gültig. Theoretisch sollten Sie eine Liste von "Operationen" bereitstellen. Beispielsweise sollten Sie technisch etwas senden wie:
In der Praxis ist es üblicher, eine API zu sehen, die eine Teilliste von Objekten akzeptiert, bei denen jedes Element unter Verwendung einer UPSERT-Logik (Aktualisieren oder Einfügen) verarbeitet wird.
Technisch sollte der POST die Eingabe "gemäß der spezifischen Semantik der Ressource" verarbeiten.
{resource}/activate
.ANMERKUNG: Wenn Sie Non-GET-Vorgänge für Auflistungen verwenden, sollten Sie die Definition von Erfolg und Misserfolg sorgfältig berücksichtigen. Mit REST können Sie keinen guten Teilerfolg kommunizieren. Ein guter Standardwert ist die Annahme, dass Sie den Vorgang in einer Transaktion mit einem Erfolgskriterium ausführen, das alles oder nichts enthält. Wenn Sie dies nicht möchten, sollten Sie wahrscheinlich nicht direkt mit der Sammlung interagieren.
quelle