Laut Roy Fielding (einem der Hauptautoren der HTTP-Spezifikation) erwähnt er in seiner wegweisenden These Architectural Styles bei der Diskussion von REST :
[E] Jede Anfrage vom Client an den Server muss alle Informationen enthalten, die zum Verständnis der Anfrage erforderlich sind, und kann keinen auf dem Server gespeicherten Kontext nutzen.
Unter "gespeichertem Kontext" versteht er den Anwendungsstatus, z. B. die Seitenzahl für die nächste Seite, im Vergleich zum Ressourcenstatus, z. B. ein beliebiger Datenspeicher, ein Bild usw. - was wohl der ganze Punkt von REST ist.
Ist es gerechtfertigt zu sagen, dass die meisten Versuche einer reinen Pause (hier definiert als eine Implementierung, die der obigen These entspricht) fehlschlagen müssen, weil sie darauf angewiesen sind, Sitzungsdaten auf dem Server zu speichern (dauerhaft oder anderweitig)?
Das Konzept einer Sitzung ist - insbesondere für Webentwickler - üblich, aber ist es gemäß der obigen Definition REST-konform?
Antworten:
Ich würde ja sagen, der Sitzungsstatus macht eine RESTful-App nicht-RESTful. Triviales Beispiel, meine Schwester abonniert das Wall Street Journal. Regelmäßig liest sie etwas hinter der Paywall und beschließt, einen Link (über ihren eigenen E-Mail-Client, nicht über WSJ) an einen Freund zu senden, der kein WSJ-Konto hat. Klicken, senden, fehlschlagen. Offensichtlich unterscheidet sich die Erfahrung meiner Schwester unter dieser URL von der ihrer Freundin.
Verwandt, aber nicht themenbezogen: Ich befinde mich in der frühen Entwurfsphase einer Anwendung, die erhebliche Forschungsbemühungen im Internet unterstützen soll (so genannte Quests (think: Lesezeichen für Steroide und LSD)). Der Besitzer der Quest möchte eine bestimmte Ansicht seiner Daten mit einer anderen Person teilen. Für diese Ansicht ist jedoch eine Kombination aus dem Status der Benutzeroberfläche (z. B. welche Visualisierungen welcher Daten in welchen Bereichen angezeigt werden) und den entsprechenden Berechtigungen für den Zugriff auf die Benutzeroberfläche erforderlich und die angezeigten Daten. Es ist eine Menge Speicherstatus erforderlich, damit der Empfänger die beabsichtigte Ansicht erhält.
Meine aktuelle Lösung besteht darin, alle für die Ansicht erforderlichen UI / ACL / Informationen in einem separaten Objekt zu speichern und die URL (wahrscheinlich eine UUID) für dieses Objekt zurückzugeben. Ich glaube, dass der Zugriff auf das Ansichtsobjekt in dem Sinne als RESTful angesehen werden kann, dass jeder, der im Besitz davon ist, die gleichen Informationen / Erfahrungen erhält.
quelle
Das tun sie definitiv! Wenn Sie REST implementieren, darf keine serverseitige Sitzung vorhanden sein, andernfalls verfügen Sie über eine hybride RPC / REST-Lösung.
Der Client muss bei jeder neuen Anforderung den gesamten für die Bearbeitung der Anforderung erforderlichen Kontext, einschließlich der zur Authentifizierung des Clients erforderlichen Informationen, an einen RESTful-Service senden. Es steht dem Server frei, Informationen zwischenzuspeichern, um die Bearbeitung nachfolgender Anforderungen zu beschleunigen. Die zwischengespeicherten Informationen dürfen jedoch keine serverseitige Sitzung sein. Mit anderen Worten, die Anforderung selbst muss genügend Informationen enthalten, um auch ohne den zwischengespeicherten Status verarbeitet zu werden.
quelle
Kommt wahrscheinlich darauf an, was du mit "Sitzungsdaten" meinst. Ist das ein genauer Begriff?
Bei der sicheren Kommunikation zwischen zwei Parteien muss der Server häufig ein zeitlich begrenztes "Zugriffstoken" generieren (und speichern), das der Client mit jeder Anforderung als Art der Autorisierung bereitstellen muss. Dieses Zugriffstoken ist bereits das, was ich "Sitzungsdaten" nennen würde - es wird serverseitig, zeitlich begrenzt und auf einen Client bezogen (normalerweise seine Berechtigungen) gespeichert.
Es würde mich sehr wundern, wenn diese Art von Operation als nicht-REST-konform eingestuft würde. OAuth ist ein Beispiel.
Ich bin kein Spezialist und ich bin hier nicht sehr zuversichtlich. Ich teile nur meine Erkenntnisse in der Hoffnung, dass sie sich als hilfreich erweisen.
quelle
Der wichtigste Punkt von REST ist, dass ein URI zu einer Ressource immer auf dieselbe Ressource verweist. So können Benutzer einen Verweis auf diese Ressource weitergeben, und jeder sieht das Gleiche. Dies wird als Representational State Transfer (REST) bezeichnet. Wenn der Server den Status beibehält und eine andere Ressource für denselben URI liefert, würde ich sagen, dass dies kein reiner REST mehr ist.
quelle
Sitzungen werden im Wesentlichen verwendet, um zustandslosen, REST-konformen Anwendungen einen Status hinzuzufügen. Dies macht Ihre RESTful-Anwendung formal zwar statusbehaftet, der Server-Keep-Status vereinfacht jedoch Ihr Leben, da Sie nicht bei jeder Anforderung / Antwort alle Daten hin und her geben müssen.
In Sitzungen und allgemeiner gesagt, können Sie dies vermeiden. Dies hat einige positive Vorteile für die Leistung (weniger übertragene Daten) und die Sicherheit (weniger Daten, die manipuliert werden können).
Obwohl es offiziell einen Teil der Definition von REST verletzt, ist es so nützlich, dass es selten REST-fähige Anwendungen gibt, die den Status nicht über Sitzungen verwenden.
quelle
Fielding meinte mit dieser Anweisung, dass der Anwendungsserver, auf dem sich die REST-API befindet, den Umgebungszustand nicht mit einer Anforderung durch einen Mechanismus im Hintergrund verknüpft. Betrachten Sie den Unterschied zwischen einem Anwendungsserver und einem Datenbankserver . Die REST-Einschränkung besteht darin, dass der Anwendungsserver statusfrei sein sollte . Der Anwendungsserver kann jedoch Anforderungen für den Ressourcenzustand an den Datenbankserver delegieren, basierend auf Informationen, die Teil der Anforderung sind, z. B. eine Benutzer- / Kennwortkombination im Authorization-Header oder im Uri selbst. Schließlich basiert REST auf dem Client / Server-Modell.
quelle