Eine Webanwendung, ob RESTful oder nicht, ist im Allgemeinen nicht einfach ein Datendienst. Es stellt verschiedene Ressourcen zur Verfügung und bietet ein gewisses Verhalten. Daher hat es den Status. Es wird unterschieden zwischen dem Ressourcenstatus (clientunabhängig, von der Anwendung verwaltet) und dem Client-spezifischen Anwendungsstatus . Eine zustandslose Anwendung speichert keinen (clientspezifischen) Anwendungsstatus. Statt dessen lässt der Client dafür verantwortlich sein, und liefert ein API , das es ermöglicht, Übertragung (Anwendung) Zustand zurück macht und her (also „ S tate T ransfer“ in RE ST). Aus Sicht eines Clients ist eine Webanwendung eine Statusmaschine, die sich hinter einer API befindet, die Interaktion ermöglicht. Ein Teil des Status wird jedoch von den Clients als Kontextinformation bereitgestellt, um Anforderungen zu ergänzen.
Während Sie REST studieren, sind Sie möglicherweise auf etwas gestoßen, das als Richardson Maturity Model bezeichnet wird- Es beschreibt die "Reife" einer Webanwendungs-API (die sich im Laufe der Jahre entwickelt hat), ist aber für uns als eine Art Referenz nützlich, die die Dinge in einen Kontext stellt. In diesem Modell bieten alle Reifegrade mit Ausnahme des letzten im Wesentlichen APIs, die RPCs über HTTP ermöglichen. Bei dieser Art des API-Entwurfs wird HTTP als Transportmechanismus verwendet, die eigentliche Kommunikation erfolgt jedoch über benutzerdefinierte Protokolle, sodass die interagierenden Systeme (Clients und die Anwendung) für die Kommunikation auf sogenannte "Out-of-Band-Informationen" angewiesen sind Kontext bedeutet dies nur, dass diese Systeme unter Verwendung eines benutzerdefinierten Standards kommunizieren, anstatt Hypertext / Hypermedia und beispielsweise das vorhandene HTTP-Protokoll zu nutzen. Was also die Zustandsübertragung und Zustandsübergänge ("die Engine des Anwendungsstatus") antreibt, ist in diesem Fall keine Hypermedia.
Der endgültige Reifegrad führt die HATEOAS-Einschränkung ein, und erst dann wird die API RESTful. Der Client initiiert die Interaktion über den anfänglichen URI. Der Server antwortet mit einer geeigneten hypermedienbasierten Darstellung des Anwendungsstatus (die sich zwischen Geräten oder Clients oder aufgrund verschiedener Bedingungen unterscheiden kann - also " Re- Präsentation" in RE ST), die selbstbeschreibende Aktionen enthält, mit denen der Client arbeiten kann Initiieren Sie den nächsten Statusübergang (Hypermedia unterstützt und steuert nun direkt den Anwendungsstatus).
Kann ich die Aussage aufgreifen, dass der Anwendungsstatus kundenspezifisch ist? So verstehe ich es. [...] Es hat alles mit der Verfügbarkeit der serverseitigen Ressourcen zu tun, nichts (was ich sehen kann) mit dem Client-Status zu tun ...
Lassen Sie mich zunächst sicherstellen, dass wir auf derselben Seite sind. Dies ist nicht der Client-Status (wie im internen Status des Clients selbst), sondern der Status der Webanwendung, der für einen bestimmten Client spezifisch ist.
Das Beispiel, das Sie erwähnen, veranschaulicht es nicht wirklich gut, aber die Liste der zurückgegebenen Links wird im Wesentlichen dynamisch auf dem Server generiert und stellt aktuell verfügbare Statusübergänge dar und codiert als solches den aktuellen Anwendungsstatus (für diesen bestimmten Client). Beachten Sie, dass Sie möglicherweise andere Teile zustandsbezogener Informationen (in beide Richtungen) übertragen können, wenn Ihre Anwendung dies erfordert (Sie sind also nicht auf Zustandsübergangsmetadaten beschränkt). Die Einschränkung besteht jedoch darin, sich niemals an clientspezifische Daten zu erinnern Server, weil das die Verkaufbarkeit verletzt. Beachten Sie auch, dass dieser Status nicht vollständig sein muss (muss nicht vollständig aussagekräftig sein, wenn Sie ihn isoliert betrachten), aber es muss ausreichen, damit die empfangende Partei eine Entscheidung trifft und eine darauf basierende Logik ausführt und sonst nichts (so,
HATEOAS nutzt die einheitliche Schnittstelle (die gemeinsamen Standards und Datenaustauschformate), um die Clients und Server zu entkoppeln, sodass sie auf der Serverseite Dinge hinter dem durch den Hypermedia-Typ definierten "Vertrag" mischen können, aber auch, weil die Kommunikation auf Out- basiert. Of-Band-Informationen (benutzerdefinierte Protokolle) nutzen die Netzwerkinfrastruktur häufig nicht so, wie es REST beabsichtigt. (Siehe die Diskussion unten.)
In Ihrem Beispiel würde der Client seine Logik nicht auf den URI stützen, sondern auf Metadaten (oder Anmerkungen) wie das Attribut "rel". Ein Browser kümmert sich beispielsweise nicht um die URIs in Links, sondern muss nur wissen, um welche Art von Link es sich handelt (ein anklickbarer Link, ein Formular, aus dem Sie einen URI erstellen können, eine Stylesheet-Referenz usw.).
REST im Kontext
Leider ist REST zu einem Schlagwort geworden, und alle reden darüber, wie man RESTful ist, aber der gesamte Kontext von REST fehlt, und Sie können den REST-Architekturstil nicht verstehen, ohne diesen Kontext zu verstehen (was ist das Problem, das REST tatsächlich ist? versuchen zu lösen).
REST ist eine Verallgemeinerung der Architektur hinter dem Web . Für die meisten von uns ist das Web eine Plattform. Für Leute, die REST entwickelt haben, ist WWW eine Anwendung , die bestimmte Anforderungen stellt und in einem weltweiten Netzwerk ausgeführt wird. Daher ist REST für Systeme gedacht, die in einigen wichtigen Punkten wie das Web sind und bestimmte Eigenschaften erfüllen müssen.
Dies sind große vernetzte Systeme, die langlebig sind (denken Sie an Jahrzehnte). Hierbei handelt es sich um Systeme, die organisatorische Grenzen (z. B. zusammenarbeitende Unternehmen) oder Grenzen zwischen verschiedenen Untereinheiten in einer großen Organisation (wie verschiedenen Abteilungen und sogar Teams) überschreiten. Obwohl es eine Zusammenarbeit gibt, arbeiten alle beteiligten Entitäten größtenteils zu ihren eigenen Bedingungen, in ihrem eigenen Tempo und mit ihren eigenen Sicherheitsbedenken und verwenden unterschiedliche Geräte, Betriebssysteme usw. Sie Sie müssen auf die Ressourcen des anderen (Dokumente, Dienste, Daten) zugreifen und Verweise darauf austauschen, während Sie sich unabhängig und schrittweise weiterentwickeln können, ohne eine umfassende Koordination durchführen zu müssen (zum Teufel ist es schwierig, die Mitarbeiter dazu zu bringen, selbst eine koordinierte Bereitstellung durchzuführen innerhalb derselben Organisation).
Diejenigen, die Dienste bereitstellen, müssen in der Lage sein, beispielsweise Dienstversionen zu entwickeln, Knoten hinzuzufügen oder Daten mit minimalen Auswirkungen auf Clients zu mischen. Sie müssen skalieren. Clients (die möglicherweise selbst Dienste sind) müssen trotz all dieser Aktivitäten auf der Serverseite weiterarbeiten. Die Systeme werden in Zukunft wahrscheinlich auf unerwartete Weise eingesetzt. Die Ressourcen, auf die sie zugreifen und die sie austauschen, können von vielen verschiedenen Arten sein und intern (von Dienstanbietern) auf viele verschiedene Arten realisiert (codiert, typisiert, dargestellt, strukturiert) werden, aber dennoch für das gesamte System / Netzwerk eine konsistente Art und Weise Zugriff auf Ressourcen und Strukturdaten und Antworten sind erforderlich (einheitliche Schnittstelle).
REST berücksichtigt all dies und berücksichtigt sehr stark die Eigenschaften des Netzwerks. Es soll auf die Anforderungen von Anwendungen eingehen, die auf hoher Ebene (innerhalb ihrer eigenen Geschäftsdomäne) in Bezug auf Anforderungen und Einschränkungen den oben beschriebenen Anforderungen ähnlich sind (oder dies anstreben).
Und das tut es, aber es ist kein Allheilmittel. Es gibt Kosten und Kompromisse. Es setzt einen bestimmten Kommunikationsstil voraus und es gibt einen Performance-Hit. Sie übertragen Daten immer grobkörnig, häufig dieselben Daten wiederholt, in einem Format, das verallgemeinert ist (und daher für Ihren Dienst möglicherweise nicht das effizienteste ist), mit einer Reihe von Metadaten, häufig über zwischengeschaltete Netzwerkknoten ( Somit das gesamte Caching im Web - es minimiert das Hin- und Her-Senden von Daten und hält den Client nach Möglichkeit vom Dienst fern. Die vom Benutzer wahrgenommene Leistung ist wichtig, was sich auf das Schreiben von Clients auswirkt (aus diesem Grund beginnen Browser, die Seite zu rendern, bevor alles heruntergeladen oder bereit ist). Sie zahlen diese Kosten jedoch gerne, um ein System mit den oben beschriebenen Eigenschaften erstellen zu können.
Wenn Sie dagegen ein System mit unterschiedlichen Anforderungen / Einschränkungen erstellen, sind die Kosten möglicherweise nicht wert.