Ich werde diese Frage auf diese Weise stellen - was sind die Bedenken der Softwareentwicklung, wenn meine REST-API nicht "richtig" implementiert wird?
Was meinst du mit dem "richtigen" Weg? Lassen Sie mich meine Wahrnehmung des richtigen Weges erklären, dann erkläre ich Ihnen, wie ich es mache (nehmen Sie auch an, ich spreche von einer JSON-REST-API).
Der richtige Weg
Staatenlosigkeit. Dies ist der Teil, den ich bekomme. Der Client behält den Status immer zu 100% für immer bei. Es ist nicht die Aufgabe des Servers, sondern die des Kunden.
Die erwarteten Aktionen und Antworten für jedes Verb:
- GET - Ruft eine vollständig angegebene Ressource ab, die nur durch die Berechtigung in der Anforderung oder einen Abfrageparameter begrenzt ist. Dies stellt sicher, dass keine Ressource im Prozess geändert wird.
- POST - Bei einer vollständigen Ressourcenbeschreibung (wie einem JSON-Objekt) wird eine Ressource erstellt und diese Ressource zurückgegeben, wobei auch alle serverseitigen Eigenschaften wie Datumsangaben oder IDs erstellt werden.
- LÖSCHEN - Löscht eine angegebene Ressource und gibt als Antwort nur 200 OK an
- PUT - Bei einer vollständigen Objektdeklaration als Eingabe wird die Ressource an einem bestimmten Speicherort aktualisiert, wobei alle Felder der Ressource auf jedes der in der Eingabe angegebenen Felder aktualisiert werden. Damit wird klargestellt, dass das gesamte Objekt als Eingabe übergeben wird. Die gesamte aktualisierte Ressource wird mit allen Feldern zurückgegeben (entsprechend der Autorisierung oder anderen Eingabeflags).
- PATCH - Wenn nur die Felder für eine Ressource geändert werden sollen, werden nur die Felder in einer angegebenen Ressource aktualisiert, die als Eingabe angegeben werden. (Hier bin ich unklar): Die gesamte Ressource wird zurückgegeben? (Oder sind es nur die aktualisierten Felder? Keine Ahnung. Ist mir egal.)
- Ressourcenpfade. In Anbetracht der Beziehung der Ressourcen zueinander kann ein Ressourcenpfad wie folgt aussehen:
- / parentresource /: id
- / parentresource /: id / childresource
- / parentresource /: id / childresource /: childId
- / parentresource /: id / childresource /: childId / subresource /: subresourceId (In diesem Beispiel gehört eine Unterressource zu einer untergeordneten Ressource, die zu einer übergeordneten Ressource gehört).
So wie ich es machen will
Das Obige ist mein Verständnis davon, wie eine REST-API funktionieren soll. Lassen Sie mich nun einige meiner Variationen zu den oben genannten auflisten:
- PUT / PATCH - Wozu wird die gesamte Ressource zur Änderung übergeben? Ich verwende PUTs nur zum Ändern von Ressourcen und übergebe nur die Felder, die aktualisiert werden sollen. Daher muss ich PATCH nicht verwenden
Ressourcenpfade - Ich verwende GUIDs in meiner Anwendung. Infolgedessen werden sie weltweit einzigartig sein. Warum benötige ich den vollständigen Ressourcenpfad, einschließlich der übergeordneten Ressourcen, wenn ich nur eindeutig auf eine Unterressource selbst verweisen kann? Wie:
/ subresource /: subresourceId
Wenn ich es "richtig" machen würde, würde der Versuch, auf die Subressource zu verweisen, einen vollständigen Pfad erfordern wie:
/ parentresource /: id / childresource /: childId / subresource /: subresourceId
Ist alles notwendig ? Weil ich jetzt eine zusätzliche Fehlerbehandlung haben muss, wenn mein Pfad eine: subresourceId enthält, die nicht tatsächlich einer bestimmten: childId gehört, und ebenso eine: childId, die keiner übergeordneten: id gehört. Meine Serverseite kümmert sich um die Ressourcenautorisierung. Kann ich nicht einfach auf die Ressource selbst verweisen und nicht auf den vollständigen Pfad?Die Rückantwort. Nehmen wir zum Beispiel an, meine Datenstruktur ist ein hierarchischer Baum ohne praktische Grenzen für die Baumtiefe. Ressourcen liegen hierarchisch auf verschiedenen Ebenen im Baum.
- Das GET ist offensichtlich. Wenn ich diesen gesamten Baum erhalte, erwarte ich den gesamten Baum als Antwort mit Ressourcen, die in Ressourcen enthalten sind.
- Wenn ich POST, um eine neue Ressource zu erstellen, PUT zu aktualisieren oder DELETE, um sie zu entfernen, möchte ich die Deltas im Baum sehen, anstatt nur die Ressource zu sehen, die ich erstellt / aktualisiert / gelöscht habe. Ich möchte nicht nach jedem POST, PUT oder DELETE erneut das GET des übergeordneten Baums aufrufen müssen, insbesondere wenn es kleine Änderungen am Baum gibt und ich nur die Deltas sehen möchte.
Hoffentlich sind meine Fragen klar.
Wenn Sie eine REST-Implementierung sehen würden, wie ich sie beschrieben habe, würden Sie sie betrachten und mir Ihre Bedenken hinsichtlich der Softwareentwicklung mitteilen? Wenn ja, was wären sie?