2009-12-22 7 views
6

Kurzfassung der Frage:
Muss "GET" bei einem bestimmten URI übereinstimmen, was "PUT" mit diesem URI war?REST Frage: eine Darstellung PUT, ein unterschiedliches erhalten?

glaube ich nicht. Hier ist der Grund:

Da eine Ressource ist eine abstrakte Sache, die vom Client theoretisch unerkennbar ist, wenn wir eine PUT tun, müssen wir sein, nur eine Vertretung schicken. Basierend auf Kämmen über RFC2616, ist es nicht vollständig spezifiziert sein scheinen, was das bedeutet, für eine Ressource, die viele (möglicherweise unendlich?) Darstellungen, aber hier sind meine Gedanken; Bitte sagen Sie mir, wenn Sie zustimmen:

Meine Erwartung ist, dass, wenn ich eine Darstellung auf eine Ressource PUT, alle anderen Darstellungen der Ressource in diesem URI konsistent gehalten werden (möglicherweise aktualisiert) wie nötig. Mit anderen Worten, Sie sagen der Ressource "Verwenden Sie diese Repräsentation, um sich selbst neu zu definieren".

So sollte ich in der Lage sein, dies zu tun:

PUT/resources/foo/myvacation
Content-type: image/jpg
...

und Follow-up mit diesem:

GET/resources/foo/myvacation
akzeptieren: image/png
...

und die aktualisierte Version von myvacation in einem anderen Format erhalten (der Server unter der Annahme, weiß, wie das zu tun). Rechnet man aus, dass dieser Verbund atomaren "Bild + Metadaten" PUT sollte auch legal sein:

PUT/resources/foo/myvacation
Content-type: multipart/form-data

Content-disposition: Formulardaten; name = "document"
Content-type: image/jpg
[..]
Content-disposition: form-data; name = "iptc"
Inhaltstyp: application/iptc
[..]
Inhaltsdisposition: Formulardaten; name = "exif"
Content-type: application/exif
[..]

Und dann, weil serverseitige Content Negotiation (RFC2616 Abschnitt 12.1) stattfinden kann, basierend auf so ziemlich alles, wir Standardmäßig kann das "Dokument" Inhalte für diese:

GET/resources/foo/myvacation
Content-type: image/jpg
[..]

oder wenn Sie glauben, als ich, dass RFC 2396 Abschnitt 3 tun.4 "Die Abfragekomponente ist eine Informationskette, die von der Ressource interpretiert werden soll." bedeutet, dass ein URI mit einer Abfragezeichenfolge auf dieselbe Ressource verweist wie eine URI ohne eine Abfragezeichenfolge (und isomorph ist, wenn nur application/x-form-urlencoded-Daten an die Ressource gesendet werden). Dies sollte auch zulässig sein:

?

GET/resources/foo/myvacation content = exif
Content-type: application/exif
[..]

Die Beschreibung der PUT sagt:

Die PUT-Methode Anfragen dass die umschließen d entity wird unter dem angegebenen Request-URI gespeichert.

Für mich ist dies ziemlich anti-REST, es sei denn, Sie lesen es in einer sehr liberalen Art und Weise. Meine Interpretation lautet "Die PUT-Methode fordert an, dass eine Ressource auf der Grundlage der Repräsentation der eingeschlossenen Entität im bereitgestellten Anforderungs-URI erstellt oder aktualisiert wird."

Später, erhalten wir:

Der grundlegende Unterschied zwischen der POST und PUT-Anfragen reflektiert wird in der unterschiedlichen Bedeutung des Request-URI. Der URI in einer POST-Anforderung identifiziert die Ressource, die die eingeschlossene Entität verarbeiten wird. Diese Ressource kann ein Daten akzeptierender Prozess, ein Gateway zu einem anderen Protokoll oder eine separate Entität sein, die Annotationen akzeptiert. Im Gegensatz dazu 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.

Wir müssen das ähnlich kreativ lesen, aber die wichtigsten Bits hier sind "weiß, was URI gemeint ist" und "die Anfrage anwenden".

Also, für mich die Darstellung von GET bei einem bestimmten URI zurückgegeben muss nicht unbedingt die gleiche Darstellung sein, die an den angegebenen URI PUT, es muss nur konsistent sein.

Wahr oder falsch?

+0

Ich habe kürzlich entdeckt, dass RFC2616 durch RFC3986 ersetzt wurde, die die Abfrage so definiert, dass es verwendet werden kann, um die Ressource zu finden. Ich bin mir nicht sicher, ob mir diese neue Definition gefällt. : -/ –

Antwort

1

Wenn Sie transformieren dann wäre es sinnvoll, dass Sie PUT nicht, was Sie GET, so sehe ich nicht, warum es ein Problem ist.

Aber, wenn Sie PUT ein Benutzer mit bestimmten Informationen, dann, wenn Sie GET verwenden, dann sollte es diese Person abrufen, so wie, wenn ich mein 4. Urlaub Foto setzen, wenn ich GET nennen erwarte ich, dass Foto, aber es kann umgewandelt werden, indem man in ein anderes Format umwandelt, oder andere Transformationen, aber wenn ich stattdessen das fünfte Foto bekomme, dann ist das ein Problem.

5

Basierend auf der Tatsache, dass Content-Negotiation verschiedene Darstellungen aus dem gleichen URI zurückgeben kann, bin ich mir ziemlich sicher, dass das, was Sie PUT müssen nicht dasselbe sein, was Sie abrufen.

+0

Ganz richtig. Unter Verwendung des Headers Content-Type ist es vollkommen legal, ein XML-Objekt zu POST zu bringen und dann später eine JSON- oder XHTML-Darstellung zurück zu holen. Solche Transformationen erleichtern die Verwendung Ihrer Restful-API in vielen verschiedenen Anwendungen. –

+0

@Darrel - Ich stimme dem zu, obwohl der Fall eines unnötigen GET mich dazu bringt, mich ein bisschen schuldig zu fühlen. Ich verlasse mich auf die Klausel "server-side negotiation can be using objectives it will", die sich komisch anfühlt, als ich es möchte. @Lars - POST ist ein anderes Tier, obwohl. Die Definition von PUT ist viel eingeschränkter, daher meine Frage. –

3

Ihre Annahmen sind richtig. Das GET muss nicht notwendigerweise dieselbe Darstellung als das, was Sie PUT, aber es muss die gleiche Ressource sein.

Ich arbeite derzeit an einer Webanwendung, die jede Ressource als XHTML, JSON oder einen benutzerdefinierten XML-Dialekt zurückgibt, je nachdem, was Sie in den Kopfzeilen der Inhaltsverhandlung fordern. So wird ein Browser das HTML standardmäßig sehen.Andere HTTP-Clients, einschließlich XMLHttpRequest, können JSON usw. abrufen. Sie sind alle Darstellungen der gleichen Ressource im selben URI.

Ebenso unsere Anwendung wird eine PUT oder POST in einem der unterstützten Formate akzeptieren (vorbehaltlich der Semantik der jeweiligen Ressource oder Sammlung in Frage.)

2

ich mit den anderen Antworten zustimmen, dass Ressource, die Sie PUT Es ist nicht erforderlich, dass es dasselbe ist wie das, das Sie später abrufen. Ich wollte einige meiner Erfahrungen zu dieser Frage in diesem Bereich hinzufügen.

Sie müssen sehr vorsichtig sein, wenn Sie sich auf Content-Negotiation verlassen. Es ist sehr schwierig, richtig zu kommen, und wenn Sie es nicht richtig machen, führt das zu unangenehmen Benutzerproblemen. Lassen Sie uns ein Beispiel basierend auf Bildern ...

Wenn Alice ein Bild in einem RAW-Format, dann Bob kann das Bild als JPEG (durch eine Server-Seite RAW-> JPEG-Transformation), und Alice kann holen Bild in einem Rohformat; Keine Probleme. Wenn Bob jedoch ein JPEG einfügt, gibt es keine Möglichkeit, zu dem ursprünglichen Format für Alice zurückzukehren. Im Falle von Urlaubsfotos ist das Fehlen symmetrischer Transformationen vielleicht keine große Sache, aber in medizinischen Bildern wäre es das.

Ein weiterer Bereich, wo das Fehlen von symmetrischen Transformationen beißt, ist in Darstellungen, wo man ein Schema hat und das andere nicht. In diesem Fall müssen Sie auf der Serverseite Konventionen für die Transformation zwischen ihnen festlegen. Aber Sie geraten in große Probleme, wenn Sie mit Dokumenten arbeiten, deren Schemata sich im Laufe der Zeit ändern und die Sie nicht kontrollieren können. Jedes Mal, wenn sich das Schema ändert, müssen Sie alle Transformationen für die neue Schemahaltung aktualisieren, während Sie weiterhin Ressourcen mit dem alten Schema unterstützen. Inhaltliche Verhandlungen werden schnell schwieriger als ihr Wert, abgesehen von einigen wenigen Umständen. Einer der Bereiche, in denen es überschaubar ist, ist, wenn Sie die Ressourcendarstellung und das zugrunde liegende Schema vollständig steuern. Ein weiterer Bereich ist, wenn die Ressourcenformate Standards sind und symmetrische Transformationen zwischen den verschiedenen Formaten möglich sind.