Ich arbeite an einem kleinen Client-Server-Programm, um Bestellungen zu sammeln. Ich möchte dies auf eine "REST (ful) Weise" tun.
Was ich tun möchte ist:
Sammeln Sie alle Bestellpositionen (Produkt und Menge) und senden Sie die vollständige Bestellung an den Server
Im Moment sehe ich zwei Möglichkeiten, dies zu tun:
- Senden Sie jede Bestellposition an den Server: POST-Menge und Produkt-ID
Ich möchte dies eigentlich nicht tun, weil ich die Anzahl der Anforderungen an den Server begrenzen möchte, also Option 2:
- Sammeln Sie alle Bestellpositionen und senden Sie sie sofort an den Server.
Wie soll ich Option 2 implementieren? Ich habe folgende Ideen: Wickeln Sie alle Bestellzeilen in ein JSON-Objekt und senden Sie diese an den Server oder verwenden Sie ein Array, um die Bestellpositionen zu veröffentlichen.
Ist es eine gute Idee oder eine gute Praxis, Option 2 zu implementieren, und wenn ja, wie soll ich das tun?
Was ist eine gute Praxis?
/api/book-group
,/api/book-collection
oder etwas ähnliches.Obwohl Massenoperationen (z. B. Batch-Erstellung) in vielen Systemen unerlässlich sind, werden sie vom RESTful-Architekturstil formal nicht berücksichtigt.
Ich habe festgestellt, dass das POSTEN einer Sammlung, wie Sie vorgeschlagen haben, grundsätzlich funktioniert. Es treten jedoch Probleme auf, wenn Sie als Antwort auf eine solche Anforderung Fehler melden müssen. Solche Probleme sind schlimmer, wenn mehrere Fehler aus unterschiedlichen Gründen auftreten oder wenn der Server keine Transaktionen unterstützt. Mein Vorschlag an Sie ist, dass es sich lohnt, 100 POST-Anforderungen an den Server zu senden, wenn kein Leistungsproblem vorliegt, z. B. wenn sich der Dienstanbieter im LAN befindet (nicht im WAN) oder wenn die Daten relativ klein sind. Halten Sie es einfach, beginnen Sie mit separaten Anforderungen und versuchen Sie zu optimieren, wenn Sie ein Leistungsproblem haben.
quelle
Facebook erklärt, wie das geht: https://developers.facebook.com/docs/graph-api/making-multiple-requests
quelle
Ihre Idee scheint mir gültig zu sein. Die Implementierung ist eine Frage Ihrer Präferenz. Sie können JSON oder nur Parameter für dieses Array ("order_lines []") verwenden und tun
Da Sie in einer einzigen Aktion (Reihenfolge und ihre Zeilen) mehr Ressourcen gleichzeitig erstellen, ist es wichtig, jede einzelne zu validieren und nur zu speichern, wenn alle die Validierung bestehen, d. H. Sie sollten es in einer Transaktion tun.
quelle
Ich denke, es ist besser, separate Anfragen innerhalb einer einzigen Verbindung zu senden . Natürlich sollte Ihr Webserver dies unterstützen
quelle
Ich habe in letzter Zeit tatsächlich damit gerungen, und hier ist, worauf ich hinarbeite.
Wenn ein POST, der mehrere Ressourcen hinzufügt, erfolgreich ist, geben Sie ein 200 OK (ich habe ein 201 in Betracht gezogen, aber der Benutzer landet letztendlich nicht auf einer erstellten Ressource) zusammen mit einer Seite zurück, auf der alle hinzugefügten Ressourcen entweder beim Lesen angezeigt werden -nur oder bearbeitbare Mode. Beispielsweise kann ein Benutzer mehrere Bilder auswählen und in eine Galerie POSTEN, indem er ein Formular verwendet, das nur eine einzige Dateieingabe enthält. Wenn die POST-Anforderung vollständig erfolgreich ist, wird dem Benutzer für jede erstellte Bildressourcendarstellung eine Reihe von Formularen angezeigt, mit denen er weitere Details zu jeder (Name, Beschreibung usw.) angeben kann.
Für den Fall, dass eine oder mehrere Ressourcen nicht erstellt werden können, bricht der POST-Handler die gesamte Verarbeitung ab und hängt jede einzelne Fehlermeldung an ein Array an. Anschließend wird ein 419-Konflikt zurückgegeben und der Benutzer wird zu einer 419-Konfliktfehlerseite weitergeleitet, auf der der Inhalt des Fehlerarrays sowie ein Weg zurück zu dem übermittelten Formular angezeigt wird.
quelle
Sie möchten die HTTP-Header nicht für 100 Bestellpositionen senden. Sie möchten auch nicht mehr Anfragen als nötig generieren.
Senden Sie die gesamte Bestellung in einem JSON-Objekt an den Server an: server / order oder server / order / new. Geben Sie etwas zurück, das auf Folgendes zeigt: server / order / order_id
Erwägen Sieauch die Verwendung vonCREATEPUT anstelle von POSTquelle