Ich bin dabei, eine HTTP-API zu entwerfen, die hoffentlich so restvoll wie möglich ist.
Es gibt einige Aktionen, die sich auf einige Ressourcen erstrecken und manchmal rückgängig gemacht werden müssen.
Ich dachte mir, das klingt wie ein Befehlsmuster, aber wie kann ich es in eine Ressource umwandeln?
Ich werde eine neue Ressource namens XXAction vorstellen, wie DepositAction, die durch etwas wie dieses erstellt wird
POST /card/{card-id}/account/{account-id}/Deposit
AmountToDeposit=100, different parameters...
Dadurch wird eine neue DepositAction erstellt und die Do / Execute-Methode aktiviert. In diesem Fall bedeutet die Rückgabe des HTTP-Status 201 Created, dass die Aktion erfolgreich ausgeführt wurde.
Wenn ein Kunde später die Aktionsdetails einsehen möchte, kann er dies
GET /action/{action-id}
Update / PUT sollte wohl gesperrt sein, da es hier nicht relevant ist.
Und um die Aktion rückgängig zu machen, dachte ich über die Verwendung von
DELETE /action/{action-id}
Dadurch wird die Undo-Methode des betreffenden Objekts aufgerufen und dessen Status geändert.
Angenommen, ich bin mit nur einem Do-Undo zufrieden. Ich muss nicht wiederholen.
Ist dieser Ansatz in Ordnung?
Gibt es irgendwelche Tücken, Gründe, es nicht zu benutzen?
Wird dies aus der Sicht der Kunden verstanden?
quelle
Antworten:
Sie fügen eine verwirrende Abstraktionsebene hinzu
Ihre API startet sehr sauber und einfach. Ein HTTP-POST erstellt eine neue Einzahlungsressource mit den angegebenen Parametern. Dann gehen Sie von der Strecke, indem Sie die Idee von "Aktionen" einführen, die eher ein Implementierungsdetail als einen Kernbestandteil der API darstellen.
Alternativ können Sie diese HTTP-Konversation in Betracht ziehen ...
Jetzt möchten Sie diesen Vorgang rückgängig machen (technisch sollte dies in einem ausgeglichenen Buchhaltungssystem nicht zulässig sein, aber was soll's?):
Der API-Konsument weiß, dass es sich um eine Einzahlungsressource handelt, und kann bestimmen, welche Vorgänge für diese Ressource zulässig sind (normalerweise über OPTIONS in HTTP).
Obwohl die Implementierung des Löschvorgangs heute über "Aktionen" erfolgt, gibt es keine Garantie dafür, dass das sekundäre Konzept einer "Aktion" beim Migrieren dieses Systems von beispielsweise C # nach Haskell und beim Beibehalten des Frontends weiterhin einen Mehrwert schafft , während das primäre Konzept der Einzahlung sicherlich tut.
Bearbeiten, um eine Alternative zu LÖSCHEN und einzahlen abzudecken
Um einen Löschvorgang zu vermeiden, die Einzahlung jedoch effektiv zu entfernen, sollten Sie folgende Schritte ausführen (mit einer generischen Transaktion, um Ein- und Auszahlungen zu ermöglichen):
Es wird eine neue Transaktionsressource mit genau dem entgegengesetzten Betrag (-100) erstellt. Dies hat zur Folge, dass das Konto auf 0 zurückgebucht wird und die ursprüngliche Transaktion annulliert wird.
Sie könnten in Betracht ziehen, einen "Utility" -Endpunkt wie diesen zu erstellen
um den gleichen Effekt zu erzielen. Dies unterbricht jedoch die Semantik eines URI als Bezeichner, indem ein Verb eingeführt wird. Sie sollten sich besser an Substantive in Bezeichnern halten und die Operationen auf die HTTP-Verben beschränken. Auf diese Weise können Sie auf einfache Weise einen Permalink aus dem Bezeichner erstellen und für GETs usw. verwenden.
quelle
Der Hauptgrund für die Existenz von REST ist die Ausfallsicherheit gegenüber Netzwerkfehlern. Zu diesem Zweck sollten alle Operationen idempotent sein .
Der grundsätzliche Ansatz erscheint vernünftig, aber die Art und Weise, wie Sie die
DepositAction
Schöpfung beschreiben, klingt nicht als idempotent, was behoben werden sollte. Indem der Client eine eindeutige ID bereitstellt, mit der doppelte Anforderungen erkannt werden. Also würde sich die Schöpfung ändern zuWenn ein anderer PUT zu derselben URL mit demselben Inhalt wie zuvor durchgeführt wird, sollte die Antwort weiterhin lauten,
201 created
wenn der Inhalt identisch ist, und Fehler, wenn der Inhalt unterschiedlich ist. Auf diese Weise kann der Client die Anforderung einfach erneut senden, wenn sie fehlschlägt, da der Client nicht feststellen kann, ob die Anforderung oder die Antwort verloren gegangen ist.Es ist sinnvoller, PUT zu verwenden, da es nur die Ressource schreibt und idempotent ist, aber die Verwendung von POST würde auch keine Probleme verursachen.
Um die Transaktionsdetails anzuzeigen, verwendet der Client
GET
dieselbe URL, d. Hund um es rückgängig zu machen, kann es es LÖSCHEN. Aber wenn es tatsächlich irgendetwas mit Geld zu tun hat, wie es das Beispiel vorschlägt, würde ich vorschlagen, es mit hinzugefügten "abgebrochenen" Flags zu setzen, obwohl dies der Verantwortlichkeit wegen eine Spur von erstellten und abgebrochenen Transaktionen bleibt.
Nun müssen Sie eine Methode zum Erstellen der eindeutigen ID auswählen. Sie haben mehrere Möglichkeiten:
quelle