2012-06-04 5 views
24

Sollte nicht PUT zu Create und POST-Update verwendet werden, da PUT idempotent ist.REST - Sollte nicht PUT = Erstellen und POST = Update

Auf diese Weise mehrere PUTs für die gleiche Bestellung wird nur eine Bestellung platzieren?

+1

siehe http://stackoverflow.com/questions/630453/put-vs-post-in-rest/2590281#2590281 –

Antwort

47

Der entscheidende Unterschied ist, dass ein PUT für eine bekannte Ressource ist und daher für die Aktualisierung verwendet wird, as stated here in rfc2616.

Der grundlegende Unterschied zwischen den POST- und PUT-Anfragen ist , der sich in der unterschiedlichen Bedeutung der Request-URI widerspiegelt. Der URI in einer POST-Anfrage identifiziert die Ressource, die die beigefügte Entität verarbeiten wird. Diese Ressource kann ein Datenakzeptanzprozess sein, ein Gateway zu einem anderen Protokoll oder eine separate Entität, die Anmerkungen akzeptiert. In dagegen identifiziert der URI in einer PUT-Anforderung die Entität, die der Anforderung beigefügt ist - der Benutzeragent weiß, welcher URI gemeint ist, und der -Server darf NICHT versuchen, die Anforderung auf eine andere Ressource anzuwenden. Wenn der Server wünscht, dass die Anforderung an einen anderen URI

angewendet werden, ich sehe, wo Sie basieren auf den Namen kommen aber selbst.

Normalerweise schaue ich auf POST, wie es die URI sein sollte, die den Inhalt meiner Anfrage (in den meisten Fällen die Parameter als Formularwerte) und damit eine neue Ressource und PUT als die URI, die Gegenstand der ist meine Anfrage (/ users/1234), eine Ressource, die bereits existiert.

Ich glaube, dass die Nomenklatur einen langen Weg zurückgeht, betrachten Sie das frühe Web. Man könnte wollen POST ihre Nachricht an ein Message Board, und dann PUT zusätzlichen Inhalt in ihre Nachricht zu einem späteren Zeitpunkt.

+9

Um dies ein wenig zu erweitern, denke ich, es könnte klarer sein, an PUT als Synonym für zu denken "set" und POST als Synonym für "create child of". Ich würde weder an "erstellen" noch an "aktualisieren" denken, weil es dir die falsche Intuition gibt. –

+0

Guter Punkt @JohnWatts, das ist der typische Anwendungsfall, selten sollte man hier etwas außerhalb der Norm machen müssen. Wenn Sie Anfragen nicht standardgemäß bearbeiten, sollten Sie die Absicht dessen, was Sie versuchen, von vornherein überdenken. –

+8

Martin Fowler sagt "[einige Leute fälschlicherweise eine Korrespondenz zwischen' POST '/' PUT' und 'create' /' update'] (http://martinfowler.com/articles/richardsonMaturityModel.html) " –

5

PUT sollte nur zum Erstellen verwendet werden, wenn URI der neuen Ressource für einen Client bekannt ist. Neue URI kann vom Dienst in der Ressourcendarstellung angekündigt werden. Zum Beispiel kann der Dienst eine Art von Übermittlungsformular bereitstellen und einen Aktions-URI angeben, der ein vorab gefüllter URI der neuen Ressource sein kann. In diesem Fall, ja, wenn die erste PUT-Anfrage erfolgreich eine Ressource erstellt, die der PUT-Anfrage folgt, wird sie nur ersetzt.

Es ist in Ordnung, POST für Updates zu verwenden, es wurde nie gesagt, dass POST nur für "create" Operationen ist.

0

Es kommt darauf an .. Sie können Websites/Datensätze mit beiden erstellen/aktualisieren. Wenn der Client den URI angibt, ist PUT der richtige Weg. z.B. Jeder Code Editor wie Dreamweaver, PUT ist das richtige Protokoll zu verwenden.

haben auch einen Blick auf diesen Thread: put vs post in rest

+0

Es ist nicht möglich, dass Sie sie mit einem beliebigen Anforderungstyp erstellen oder aktualisieren. Sie können _in_de_ eine Ressource mit einem GET erstellen oder DELETE, wenn Sie dies wirklich möchten. Es hat viel mit den Konventionen von REST zu tun. In jedem Fall müssen Sie in jeder Anfrage einen URI angeben. –

4

Es gibt keine strikte Übereinstimmung zwischen HTTP-Methoden und CRUD. Dies ist eine Konvention, die von einigen Frameworks übernommen wird, aber sie hat nichts mit REST-Einschränkungen zu tun.

Eine Anfrage PUT fordert den Server auf, alles, was an der gegebenen URI ist, durch die beigefügte Darstellung zu ersetzen, wobei der aktuelle Inhalt vollständig ignoriert wird. Eine gute Analogie ist der mv Befehl in einer Shell. Es erstellt die neue Datei am Zielort, wenn sie nicht existiert, oder ersetzt alles, was existiert.In beiden Fällen ignoriert es vollständig, was auch immer dort ist. Sie können damit etwas erstellen, aber auch etwas aktualisieren, solange Sie eine vollständige Darstellung senden.

POST fordert die Zielressource auf, die Payload gemäß vordefinierter Regeln zu verarbeiten. Dies ist die Methode, die für jede Operation verwendet wird, die nicht bereits durch das HTTP-Protokoll standardisiert ist. Das bedeutet, dass POST alles tun kann, was Sie wollen, solange Sie die Funktionalität nicht von einer anderen Methode duplizieren - zum Beispiel POST zum Abrufen verwenden, wenn Sie GET verwenden - und es ordnungsgemäß dokumentieren.

So können Sie sowohl für erstellen und aktualisieren, abhängig von den genauen Umständen, aber mit PUT müssen Sie konsistente Semantik für alles in Ihrer API haben und Sie können keine Teilupdates machen, und mit POST können Sie alles tun Sie wollen, solange Sie dokumentieren, wie genau es funktioniert.

+0

Ich denke, das ist die einfachste und agnostische Antwort. Es spielt keine Rolle, das Framework, REST, Methodik, es liegt an dem Prozess, den Sie das Verb fördern möchten, das Sie auferlegen sollten. PUT wird eine Sache tun, POST, was auch immer Sie tun möchten! Kristallklar! –

Verwandte Themen