Ich möchte einige Ratschläge zum Entwerfen einer REST-API, mit der Clients eine große Anzahl von Objekten effizient zu einer Sammlung hinzufügen / daraus entfernen können.
Über die API müssen Clients in der Lage sein, Elemente zur Sammlung hinzuzufügen und Elemente daraus zu entfernen sowie vorhandene Elemente zu bearbeiten. In vielen Fällen möchte der Client die Sammlung in großen Mengen aktualisieren, z. B. 1000 Elemente hinzufügen und 500 verschiedene Elemente löschen. Es scheint, dass der Client dies in einer einzigen Transaktion mit dem Server tun sollte, anstatt 1000 separate POST-Anforderungen und 500 DELETEs zu benötigen.
Hat jemand Informationen zu den Best Practices oder Konventionen, um dies zu erreichen?
Mein derzeitiger Gedanke ist, dass man in der Lage sein sollte, ein Objekt zu PUTEN, das die Änderung des Sammlungs-URI darstellt, aber dies scheint im Widerspruch zum HTTP 1.1-RFC zu stehen , was darauf hindeutet, dass die in einer PUT-Anforderung gesendeten Daten unabhängig von der interpretiert werden sollten Daten bereits am URI vorhanden. Dies bedeutet, dass der Client auf einmal eine vollständige Beschreibung des neuen Status der Sammlung senden muss, die möglicherweise sehr viel größer als die Änderung oder sogar größer ist, als der Client bei der Anforderung wissen würde.
Natürlich würde ich gerne bei Bedarf vom RFC abweichen, würde dies aber lieber auf herkömmliche Weise tun, wenn eine solche Konvention existiert.
Antworten:
Vielleicht möchten Sie sich die Änderungsaufgabe als eine Ressource für sich vorstellen. Sie setzen also wirklich ein einzelnes Objekt ein, bei dem es sich um ein Bulk Data Update-Objekt handelt. Vielleicht hat es einen Namen, einen Eigentümer und einen großen Blob aus CSV, XML usw., der analysiert und ausgeführt werden muss. Im Fall von CSV möchten Sie möglicherweise auch identifizieren, welche Art von Objekten in den CSV-Daten dargestellt werden.
Listen Sie Jobs auf, fügen Sie einen Job hinzu, zeigen Sie den Status eines Jobs an, aktualisieren Sie einen Job (wahrscheinlich, um ihn zu starten / zu stoppen), löschen Sie einen Job (stoppen Sie ihn, wenn er ausgeführt wird) usw. Diese Vorgänge lassen sich problemlos einem REST-API-Design zuordnen.
Sobald Sie dies eingerichtet haben, können Sie problemlos verschiedene Datentypen hinzufügen, die Ihr Massendaten-Updater verarbeiten kann, möglicherweise sogar in derselben Aufgabe zusammenmischen. Es ist nicht erforderlich, dass dieselbe API für jede Art von Dingen, die Sie importieren möchten, in Ihrer gesamten App dupliziert wird.
Dies eignet sich auch sehr leicht für eine Implementierung von Hintergrundaufgaben. In diesem Fall möchten Sie wahrscheinlich Felder zu den einzelnen Aufgabenobjekten hinzufügen, mit denen der API-Client angeben kann, wie sie benachrichtigt werden sollen (eine URL, die Sie abrufen sollen, wenn dies erledigt ist, oder ihnen eine E-Mail senden usw.). .
quelle
Ja, PUT erstellt / überschreibt, wird jedoch nicht teilweise aktualisiert.
Wenn Sie eine teilweise Aktualisierungssemantik benötigen, verwenden Sie PATCH. Siehe http://greenbytes.de/tech/webdav/draft-dusseault-http-patch-14.html .
quelle
Sie sollten AtomPub verwenden . Es wurde speziell für die Verwaltung von Sammlungen über HTTP entwickelt. Möglicherweise gibt es sogar eine Implementierung für die Sprache Ihrer Wahl.
quelle
Zumindest für die POSTs scheint es möglich zu sein, dass Sie in der Lage sein sollten, auf eine Listen-URL zu POSTEN und dass der Hauptteil der Anforderung eine Liste neuer Ressourcen anstelle einer einzelnen neuen Ressource enthält.
quelle
Soweit ich weiß, bedeutet REST REpresentational State Transfer, daher sollten Sie den Status vom Client auf den Server übertragen.
Wenn dies bedeutet, dass zu viele Daten hin und her gehen, müssen Sie möglicherweise Ihre Darstellung ändern. Eine collectionChange-Struktur würde funktionieren, mit einer Reihe von Löschungen (nach ID) und Ergänzungen (mit eingebetteten vollständigen XML-Darstellungen), die an eine URL der Bearbeitungsschnittstelle gesendet werden. Die Schnittstellenimplementierung kann eine eigene Methode für das Löschen und Hinzufügen serverseitig auswählen.
Die reinste Version wäre wahrscheinlich, die Elemente nach URL zu definieren, und die Sammlung enthält eine Reihe von URLs. Die neue Sammlung kann nach Änderungen durch den Client PUT sein, gefolgt von einer Reihe von PUTs der hinzugefügten Elemente und möglicherweise einer Reihe von Löschungen, wenn Sie die Elemente tatsächlich vom Server entfernen möchten, anstatt sie nur aus dieser Liste zu entfernen.
quelle
Sie können eine Metadarstellung vorhandener Sammlungselemente einführen, bei denen nicht der gesamte Status übertragen werden muss. In einem abstrakten Code könnte Ihr Update also folgendermaßen aussehen:
Das Hinzufügen (und Ändern) von Elementen erfolgt durch Definieren ihrer Werte, das Löschen von Elementen durch Nicht-Erwähnen der neuen Sammlung und das Neuordnen von Elementen durch Angeben der neuen Reihenfolge (sofern die Reihenfolge überhaupt gespeichert ist).
Auf diese Weise können Sie problemlos die gesamte neue Sammlung darstellen, ohne den gesamten Inhalt erneut übertragen zu müssen. Durch die Verwendung eines
If-Unmodified-Since
Headers wird sichergestellt, dass Ihre Vorstellung vom Inhalt tatsächlich mit der Idee des Servers übereinstimmt (damit Sie nicht versehentlich Elemente entfernen, von denen Sie zum Zeitpunkt der Übermittlung der Anforderung einfach nichts wussten).quelle
PUT
zweimal (möglicherweise aus Versehen) auf den Server erfolgt, sind Sie es könnte mit einer beschädigten Sammlung enden; zB Element Nr. 105 wird beim zweiten Mal ein anderes Element sein als beim ersten Mal; Verschiedene Elemente 101-104 werden beim zweiten Mal gelöscht.Der beste Weg ist:
quelle