Ich arbeite an der Entwicklung einer RESTful-API. Wir wissen, dass wir JSON und XML für eine bestimmte Ressource zurückgeben möchten. Ich hatte gedacht, wir würden so etwas machen:
GET /api/something?param1=value1
Accept: application/xml (or application/json)
Jemand hat jedoch die Verwendung von Erweiterungen für dieses Problem ausgeschlossen, z. B .:
GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)
Was sind die Kompromisse mit diesen Ansätzen? Verlassen Sie sich am besten auf den Accept-Header, wenn keine Erweiterung angegeben ist, und berücksichtigen Sie die angegebenen Erweiterungen? Hat dieser Ansatz einen Nachteil?
architecture
web-services
rest
http
Brandon Linton
quelle
quelle
Antworten:
Dies ist jedoch "philosophisch gesehen - der erste Ansatz ist der einzige Ansatz" und dieser "der richtige offizielle REST-Ansatz ist die Verwendung von Accept: header". werden weithin als der Fall angesehen, sind aber auch absolut falsch .
Hier ist ein kurzer Ausschnitt von Roy Fielding (der REST definiert hat) ...
"Abschnitt 6.2.1 besagt nicht, dass die Inhaltsaushandlung immer verwendet werden sollte." zitieren
Diese spezielle Konversation befindet sich im Kontext der Überschrift "Accept-Language:", das Gleiche gilt jedoch auch für die Überschrift "Accept:", wie später in seiner Antwort klargestellt wird ...
"Ich habe keine Ahnung, warum die Leute den zweiten und dritten Link auf der oberen Seite nicht sehen können
http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
dieser Punkt auf die beiden PDF-Ausgaben. "
Damit ist gemeint, dass es kein Problem ist, unterschiedliche Endpunkte für unterschiedliche Darstellungen derselben Quelldaten zu verwenden. (In diesem Fall ein HTML-Endpunkt und zwei verschiedene PDF-Endpunkte.)
Ebenfalls in einer ähnlichen Diskussion, diesmal in Bezug auf die Vorteile der Verwendung von Abfrageparametern im Vergleich zur Verwendung von Dateierweiterungen für verschiedene Medientypen ...
"Deshalb bevorzuge ich immer Erweiterungen. Keine der beiden Optionen hat etwas mit REST zu tun." zitieren
Auch dies unterscheidet sich geringfügig von den Dateierweiterungen "Akzeptieren" und "Dateiname", doch die Haltung von Fielding ist weiterhin klar.
Antwort - es ist wirklich egal. Die Kompromisse zwischen den beiden sind nicht sehr bedeutend und beide sind akzeptable Stile.
quelle
Der richtige offizielle RESTful-Ansatz ist die Verwendung von
Accept:
Header.Sie müssen jedoch darauf achten, die Cachefähigkeit nicht zu beschädigen, was eine der Anforderungen von REST ist. Sie müssen
Vary: Accept
Header und Cache haben, die es verstehen. In der idealen Welt hättest du es, aber im wirklichen Leben kann deine Hirse variieren. Die zweite Lösung ist also nicht so sauber, könnte aber praktischer sein.Beachten Sie auch, dass einige sehr alte Browser zum Ignorieren von Headern verwendet wurden und stattdessen auf der Erweiterung basieren.
quelle
Technisch spielt es eigentlich keine Rolle - Ihr Webserver wird in der Lage sein, den Prozess so auszuführen, wie er aussieht. (Ich gehe davon aus, sehe aber nicht wie ein Showstopper aus).
Philosophisch gesehen ist der erste Ansatz der einzige. In REST verweist die URL tatsächlich nur auf einen URI - bei dem es sich nur um eine Ressource handelt. Stellen Sie sich diese Ressource für einen Moment genauso vor wie das Objekt in der objektorientierten Programmierung. Sie sprechen mit dieser Ressource über nur 4 Methoden (auch bekannt als GET / POST / PUT / DELETE - oder wenn irgendetwas, das der Transport zulässt), aber diese Methode wird nicht zur Beschreibung des Objekts. Ebenso ist der Rückgabewert nicht der URI. Das Objekt ist immer noch etwas und nicht something.xml oder something.json
Angenommen, wenn Sie den Accept-Header nicht verwenden möchten, aber trotzdem wirklich REST-philosophisch sein möchten, stört mich Folgendes nicht:
im Gegensatz zu
Aber wie gesagt, dieser Unterschied ist nur philosophisch.
quelle
@vartec: Ich denke du liegst falsch
Das richtige offizielle RESTful-Prinzip besagt, dass in HTTP-Headern nichts verborgen sein sollte, da der URI offengelegt oder referenziert wird. Alle Details zu der Anforderung / Antwort sollten als Teil des URI bereitgestellt werden
Daher empfehle ich dringend, keine Header zu verwenden, um Details über die Anfrage und die Antwort zu erhalten
Ich bin die Referenzen nicht in der Lage schnell zu finden, aber ich werde mit ihnen Post zurück (eigentlich Sie den O'reilly Veröffentlichung Buch „RESTful Web Service“ beziehen könnten ( http://shop.oreilly.com/product/9780596529260.do ) das bestätigt das selbe
quelle