2009-08-22 4 views
2

Das agavi-Framework verwendet die PUT-Anforderung für create und POST zum Aktualisieren von Informationen. Normalerweise wird dies in REST umgekehrt verwendet (oft bezieht sich dies auf POST, wenn Informationen hinzugefügt werden, während PUT den gesamten Datensatz ersetzt).Verwendet php mvc framework agavi CRUD-konform zu REST?

Wenn ich es richtig verstehe, ist das wichtige Problem, dass PUT idempotent sein muss, während POST diese Anforderung nicht hat. Daher wüsste ich, wie das Erstellen eines neuen Datensatzes idempotent sein kann (dh mehrere Anfragen führen nicht zu mehreren Kreationen eines Datensatzes), insbesondere wenn das ORM normalerweise eine ID als Primärschlüssel verwendet und die ID eines neuen Datensatzes nicht bekannt wäre an den Client (da es in der Datenbank automatisch erstellt wird), kann daher nicht Teil der Anfrage sein. Wie hält Agavi die Anforderung der Idempotenz für die PUT-Anforderung aufrecht?

Danke.

Antwort

5

PUT kann sowohl zur Erstellung als auch zur Aktualisierung kompletter Datensätze verwendet werden. POST wird normalerweise für Teilupdates und damit zusammenhängende Operationen sowie zum Erstellen eines neuen Datensatztyps auf dem Server verwendet, ohne eine URL für die Ressource anzugeben (z. B. POST an/articles/23/comments gibt einen Status 201 und einen Ort:/articles zurück)/23/Kommentare/283136 Header). In Ihrem Fall (mit einer Sequenz-/Autoinkrement-ID) würden Sie diesen Ansatz verwenden.

Allerdings ist HTML (und damit Webformulare) anders. Es kennt nur GET und POST, nicht DELETE und PUT. Bei Lösch- und Aktualisierungsvorgängen wird die POST-Methode überlastet.

Deshalb bildet Agavi POST standardmäßig auf "write" und GET auf "read" ab - es ist der häufigste Anwendungsfall, und "read" und "write" wurden gewählt, weil sie relativ neutral sind und auch in a Weg repräsentieren die Sicherheitsaspekte von GET vs POST (Sicherheit wie in "GET kann ohne Nebenwirkungen aufgerufen werden" und blah).

Sie können die Zuordnung von Verben für die AgaviWebRequest-Implementierung in factories.xml ändern. Beziehen Sie sich auf die Agavi-Benutzer-Mailing-Liste oder den IRC-Kanal, wenn Sie Hilfe benötigen (oder fragen Sie hier). Viele Leute auf dem IRC-Kanal sind auch ziemlich erfahren im Design von URL-Schemen, falls Sie mehr Hilfe benötigen, um Ihre API schön zu machen.

+0

Danke für Ihre Antwort. Ja, ich habe Anweisungen zur Änderung in der Datei factories.xml gesehen. Ich war interessiert zu wissen, warum Schienen und agavi in ​​ihrem Ansatz unterschiedlich sind. Ich denke, Ihre Antwort hat mir eine neue Perspektive für diese Frage gegeben. – txwikinger

+0

Um dies zu verdeutlichen, sollten Sie "HTML 4.01" angeben, da der Arbeitsentwurf von HTML5 andere HTTP-Verben zu Webforms hinzufügt. – aehlke

0

PUT kann zum Erstellen einer Ressource verwendet werden, außer wenn die Ressource bereits existiert (oder bereits von einer vorherigen PUT erstellt wurde), wird sie einfach aktualisiert. POST sollte die Ressourcen jedoch nicht aktualisieren, wenn dies ein einfacher CRUD ist. Beachten Sie, dass die HTTP-Verben nicht notwendigerweise eine definierte Zuordnung zu bestimmten Aktionen haben, da sie für viel mehr als nur CRUD nützlich sind.

Beachten Sie auch, dass diese Frage nichts mit REST zu tun hat - nur korrekte HTTP-Nutzung. Bitte entfernen Sie das REST-Tag.

+1

Vielen Dank für Ihre Antwort. Meine Frage war, ob agavi REST richtig verwendet, daher das Tag. – txwikinger

+0

Wie auch immer, ich habe retagged die REST-Tags zu entfernen - ich denke, Sie haben eine falsche Interpretation von REST. Was Sie hier wirklich meinen, ist "wenn agavi HTTP in geeigneter Weise verwendet." – aehlke

2

Anstatt an PUT zu denken, wie das Erstellen, denke an es als "Putting". Sie legen eine Ressource in einen URI (dh senden eine gesamte Ressource an einen URI).

PUT http://example.com/articles/1 

Wenn Sie diese (senden die gleiche gesamte Ressource auf den gleichen URI) wiederholen Sie das gleiche Ergebnis, und Sie haben nicht die Ressource an, dass URI geändert haben, ist das, was es macht idempotent.

Wenn die Implementierung von PUT von agavi idempotent ist, wird PUT korrekt implementiert. Sonst ist es nicht.

+0

Danke für Ihre Antwort. Die Frage, ob Agavis PUT idempotent ist, ist genau das, was ich herausfinden möchte. – txwikinger

0

Ich hatte dieses Problem schon einmal. Dies kann gelöst werden durch changing the factories.xml

+0

Danke für Ihre Antwort. Ich kenne die factories.xml-Konfiguration. Ich bin/war interessiert an dem Prinzip, wie es richtig gemacht werden sollte, da verschiedene Frameworks das anders zu machen scheinen. – txwikinger

Verwandte Themen