Muss ich verletzen und Erholung bei der Verwendung von POST als UPDATE ODER ERSTELLEN
Unter der Voraussetzung die anderen Abteilungen haben für unsere REST-API, die Sie verwenden möchten POST
nicht nur für SCHAFFEN aber für AKTUALISIEREN ODER zu ERSTELLEN. Ich weiß, in einer RESTful API PUT
könnte oder sollte dafür genutzt werden, aber da Kunden Informationen zu aktualisieren, die verwendet wird, um die URI, die wir nicht verwenden können, dass. Es würde den URI nur ändern, und machen PUT
nicht idempotent mehr... (die alte URI würde nicht existieren, nachdem die ersten PUT
).
tl;dr wir nicht verwenden können, SETZEN
In der HTTP/1.1 Spezifikationen POST ist definiert als
Die POST-Methode wird verwendet, um anzufordern, dass der Ursprungs-server akzeptieren, die
Person eingeschlossen in der Anforderung als eine neue untergeordnete der Ressource, die
identifiziert durch die Request-URI
aber auch
Die Aktion, die von der POST-Methode möglicherweise nicht in eine Ressource
werden können, identifiziert durch eine URI.
Aufenthalt Erholsam, ich würde erklären, die update-Funktion als eine Löschung der alten element und dann eine Kreation der neuen, das wäre eine akzeptable Funktionalität für POST
würde ich sagen.
Würden wir zurückkehren eine #201
wenn Erstellung erfolgreich war und eine #200
wenn es nur ein update.
In unserer API ist es "möglich", um das richtige element, ohne die URI (z.B. für die Aktualisierung mit POST
), weil alle das URI-Gebäude primary key Teile sind in der Ressource Körper, so dass die API-weiß, welches element den client zugreifen will.
Beispiel
(Dies ist nur ein Beispiel für das Verhalten für POST
. Nicht für die Daten, die Struktur der Ressource. Natürlich mit PUT
wäre vollkommen richtig, für /cars/
)
POST /cars/HTTP/1.1
<car>
<id>7</id>
<status>broken</status>
</car>
Antwort: #201
und dann
POST /cars/HTTP/1.1
<car>
<id>7</id>
<status>fine</status>
</car>
Antwort: #200
jetzt eine GET
auf /cars/7
würde Folgendes zurück:
<car>
<id>7</id>
<status>fine</status>
</car>
- Ich habe gerade gelöscht, mein ursprüngliche Kommentar nach einem Blick auf Ihr Beispiel, Ihre Transaktion zu sein scheint idempotent. Sie setzen den status von Auto-7 in Ordnung zu sein. Wenn Sie erneut diese Methode wieder und wieder, dann würden Sie noch am Ende mit dem gleichen Ergebnis. Deshalb gibt es keinen guten Grund, dass dieses spezielle Beispiel nicht sein konnte, eine PUT-Methode.
- Diese Antwort Abdeckungen SETZEN v POST die besten, die ich fühle. Wenn Ihre Aktion ist idempotent, dann verwenden Sie PUT-zu verwenden, ansonsten POST.
- Ich denke, dein Erster Kommentar war einfach nur gut. Das Beispiel war nur für das Verhalten (Hinzugefügt, dass auf die Frage). Sorry für die Ungenauigkeit! :/ Ich sah auch die Antwort, die Sie verweisen, aber leider ist es nicht wirklich gute Quellen (die PDF ist nicht wirklich hilfreich). Btu Kommentar zu deinem letzten statement Meinen BEITRAG (mit Aktualisieren oder Erstellen) Sie ist jetzt ein bisschen indempotent, da ruft es wieder und wieder in den gleichen Datenbestand. Die Erstellung dieser idempotenz mit PUT scheint unmöglich für meine Lösung (da sich der uri ändert)
Du musst angemeldet sein, um einen Kommentar abzugeben.
"Die Verletzung und Erholung" ist nicht genau definiert.
Eine gute Referenz Grad der REST-wie Verhalten in einer Schnittstelle ist die Richardson Maturity Model teilt Grad der Unterstützung für REST ideale in 4 Stufen (wobei 0 für "keine RUHE an allen" und 3 "komplett zu erholen, aber kaum jemand tut dies noch")
Ihrer Wahl den Pausen nur wenig mit RESTful HTTP-based design bei Stufe 2 innerhalb dieses Modells. Jedoch, es ist die Art von Kompromiss, der viele Reale-Welt-Projekte haben zu kämpfen.
POST ist offen genug, dass es sein kann, idempotent, wenn Sie es wünschen, aber HTTP nicht verlangen, dass Sie sein. So haben Sie nicht gebrochen, die mit HTTP, nur die Chance verpasst haben, zu verwenden, die mehr germane PUT-Methode. Die umgekehrte situation, mit PUT für eine nicht-idempotente Teil der API, wäre mehr als problematisch.
Als eine persönliche Meinung, ich denke, dass, wenn Sie bleiben Sie selbst-konsistent bei der Behandlung der verschiedenen HTTP-Methoden und Routen, und dieses Dokument zu ändern, um die Erwartungen klar sind, dann können Sie vernünftigerweise rufen Sie Ihren API "RESTful". Ich denke, dass die Antwort-code, split-200/201 ist genug, dass eine selbst-konsistente client geschrieben werden konnte. Obwohl ich würde es vorziehen, um zu sehen, sowohl erstellen und aktualisieren, wie hier, es ist nicht etwas, was dazu führen würde, dass mir mehr als einen moment pause.
Könnten Sie die Unterstützung aktualisieren oder zu erstellen auf der route (
POST /cars
in deinem Beispiel), wie empfohlen, plus update auf das Element route (POST /cars/7
). Das Konzept der "aktualisieren oder zu erstellen" ist Häufig genug in der Datenbank und ORM-frameworks, dass es leicht verstanden werden. Ein client könnte auch das letztere update-nur der Weg im Vertrauen, dass es nicht versehentlich automatisch einen neuen Datensatz erstellen.So idempotenz ist über die server-side-side-effects. Ihre zweite SETZEN Sie nicht andere Nebenwirkungen (weil von 404), als die erste, also mit PUT idempotent hier.
In diesem Fall, dass Sie nicht eine neue Ressource erstellen, fügen Sie einfach eine neue resource identifier und entfernen einer alten Ressource identifier. So ein POST ist unangemessen.
Dies kann bedeuten, dass alles, was Sie wollen... Ppl verwenden Sie den POST für nicht-schöpferischen Zwecken, wenn Sie aus Optionen, aber Sie sind sicherlich nicht.
Verwenden Sie die IRIs (URL) zu erkennen-Ressourcen, wenn Sie nicht wollen, um gegen die einheitliche Schnittstelle (Identifizierung von Ressourcen) Einschränkung.
Müssen Sie die hyperlinks verwenden, wenn Sie nicht wollen, um gegen die einheitliche Schnittstelle (hypermedia as the engine of application state) Einschränkung. Die IRI-Struktur nicht tragen keine Semantik für die Kunden, also kann es alles sein, wenn es ist bis zu Ihnen. Verwenden Sie die link-Beziehung oder ein Attribut von einem Jahr zum hinzufügen von Semantik.
Müssen Sie mindestens vendor-spezifischen MIME-Typen, wenn Sie nicht wollen, um gegen die einheitliche Schnittstelle (selbst-beschreibende Nachrichten) - Einschränkung.
Per definition eine REST-webservice-erfüllt alle REST-constraints. Der Begriff RESTful erstellt wurde, wenn die ppl - wer keine Ahnung hatte über REST - angefangen zu rufen, Ihre web-services wie REST. So nach, dass ppl erstellt die Rest-Begriff, was bedeutet, dass die so genannte REST-Dienst verstößt gegen keines der anderen Einschränkungen. Nach, dass der Begriff RESTful war erschöpft zu. Heute unterscheiden wir hypermedia-API und die web API. Die hypermedia-API bedeutet, dass die web-service erfüllt mit dem HATEOAS (hypermedia as the engine of application state) Einschränkung. Die web-API kann alles sein, die Forderungen zu REST.
hypermedia API
!?"If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI."
- Sie nicht haben, um erstellen Sie die neue Ressource mit PUT wenn Sie nicht wollen...can create != must create
If I accept PUT for updating these entitys, I have to accept requests where the URI is different from the body, which feels not good for me, but maybe thats unfounded.
Können Sie mir ein Beispiel nennen?/parameter/<id>/<validFrom>
und wir ändern das Datum