Wir müssen alle Artikeldaten zur Aktualisierung an die API zurücksenden, und die Mehrbenutzerarbeit konnte nicht implementiert werden. Zum Beispiel könnte der Redakteur 5 Sekunden ältere Daten senden und die Korrektur überschreiben, die ein anderer Journalist gerade vor 2 Sekunden vorgenommen hat, und ich kann dies den Kunden auf keinen Fall erklären, da diejenigen, die einen Artikel veröffentlichen, in keiner Weise mit der Aktualisierung des Inhalts verbunden sind.
Dies ist eine Herausforderung, egal was Sie tun. Es ist ein sehr ähnliches Problem wie bei der verteilten Quellcodeverwaltung (Quecksilber, Git usw.), und die in HTTP / ReST geschriebene Lösung sieht ein bisschen ähnlich aus.
Angenommen, Sie haben zwei Benutzer, Alice und Bob, an denen beide arbeiten /articles/lunch
. (Zur Verdeutlichung ist die Antwort fett gedruckt.)
Zunächst erstellt Alice den Artikel.
PUT /articles/lunch HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
301 Moved Permanently
Location: /articles/lunch/1
Der Server hat keine Ressource erstellt, da an die Anforderung keine "Version" angehängt war (unter der Annahme eines Bezeichners von /articles/{id}/{version}
. Um die Erstellung durchzuführen, wurde Alice an die URL des Artikels / der Version weitergeleitet, den / die sie erstellen wird. Benutzer von Alice Der Agent wendet die Anforderung dann erneut an der neuen Adresse an.
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
201 Created
Und jetzt wurde der Artikel erstellt. Als nächstes schaut Bob sich den Artikel an:
GET /articles/lunch HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
301 Moved Permanently
Location: /articles/lunch/1
Bob schaut dorthin:
GET /articles/lunch/1 HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
200 Ok
Content-Type: text/plain
Hey Bob, what do you want for lunch today?
Er beschließt, sein eigenes Wechselgeld hinzuzufügen.
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
301 Moved Permanently
Location: /articles/lunch/2
Wie bei Alice wird Bob an den Ort weitergeleitet, an dem er eine neue Version erstellen wird.
PUT /articles/lunch/2 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
201 Created
Schließlich entscheidet Alice, dass sie ihren eigenen Artikel hinzufügen möchte:
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
I was thinking about getting Sushi.
409 Conflict
Location: /articles/lunch/3
Content-Type: text/diff
---/articles/lunch/2
+++/articles/lunch/3
@@ 1,2 1,2 @@
Hey Bob, what do you want for lunch today?
-Does pizza sound good to you, Alice?
+I was thinking about getting Sushi.
Anstatt wie gewohnt umgeleitet zu werden, wird ein anderer Statuscode an den Client zurückgegeben, 409
der Alice mitteilt, dass die Version, von der sie abzweigen wollte, bereits verzweigt wurde. Die neuen Ressourcen wurden trotzdem erstellt (wie in der Location
Kopfzeile gezeigt), und die Unterschiede zwischen den beiden wurden in den Antworttext aufgenommen. Alice weiß jetzt, dass die Anfrage, die sie gerade gestellt hat, irgendwie zusammengeführt werden muss.
All diese Umleitungen hängen mit der Semantik von zusammen PUT
, die es erforderlich macht, dass neue Ressourcen genau dort erstellt werden, wo die Anforderungszeile dies verlangt. Dies könnte POST
stattdessen auch einen Anforderungszyklus mit speichern , aber dann müsste die Versionsnummer in der Anforderung durch eine andere Magie codiert werden, die mir zum Zwecke der Veranschaulichung weniger offensichtlich erschien, in einer echten API jedoch wahrscheinlich immer noch bevorzugt wird um Anforderungs- / Antwortzyklen zu minimieren.
api/article?action=publish
? Abfrageparameter sind für solche Fälle vorgesehen, in denen der Status der Ressource von dem von Ihnen genannten 'Algorithmus' (oder der Aktion) abhängt. ZBapi/articles?sort=asc
ist gültig