Was hat „HATEOAS“ mit dem Anwendungsstatus zu tun?

9

HATEOAS ist eine Abkürzung für "Hypermedia als Motor des Anwendungsstatus". Worauf bezieht sich die "Engine of Application State" und insbesondere - wie ist "Hypermedia" die Engine davon?

Soweit ich verstehen konnte, befassen sich HATEOAS und damit verbundene Standards wie HAL mit dem Teil "Auffindbarkeit" von REST.

Die Frühjahrsdiskussion darüber fasst zusammen als:

Mit HATEOAS erleichtert die Ausgabe die Erfassung der Interaktion mit dem Dienst, ohne dass eine Spezifikation oder ein anderes externes Dokument nachgeschlagen werden muss.

Es scheint zu sagen, dass der Client bei HATEOAS-kompatiblen Antworten, beispielsweise mit HAL-kompatiblem JSON, keinen Ressourcenpfad außer der Root-API-URL fest codieren muss.

Was durchaus Sinn macht, außer dass es nichts mit "Application State" zu tun zu haben scheint. Bestenfalls ist es mit der Serverkonfiguration (IE, wenn ich die URL für eine Ressource ändere (Serverkonfiguration), ein Verbraucher kann immer noch herausfinden, wo sie zu finden ist.


Wenn ich ein wenig auf das eingehen möchte, worum es bei HATEOAS geht, gibt es diesen Auszug aus derselben Beschreibungsseite. Was zeigt, ist, dass HATEOAS das Problem gelöst hat, herauszufinden, wo sich Ressourcen befinden. Aber es scheint sich nicht auf "Application State" zu beziehen ....

Eine einfache JSON-Präsentation wird traditionell wie folgt dargestellt:

{ 
    "name" : "Alice"
}

Die Kundendaten sind vorhanden, aber die Daten enthalten nichts über die relevanten Links.

Eine HATEOAS-basierte Antwort würde folgendermaßen aussehen:

{
    "name": "Alice",
    "links": [ {
        "rel": "self",
        "href": "http://localhost:8080/customer/1"
    } ]
}

Diese Antwort enthält nicht nur den Namen der Person, sondern auch die selbstverknüpfende URL, unter der sich diese Person befindet.

GreenAsJade
quelle
Bitte stellen Sie sicher, dass die Leute Ihre Frage verstehen können, ohne auf Links zu klicken.
candied_orange
Ich hatte gehofft, dass die Frage eigenständig ist. Der eingebettete Link soll anzeigen, woher das Zitat stammt, aber das Zitat steht für sich selbst (glaube ich?)
GreenAsJade
"Worauf bezieht sich die" Engine of Application State "?" <- Ich sehe immer noch nicht, dass Sie dieses Konzept einführen, daher kommt die Frage aus dem Nichts.
candied_orange
1
@candied_orange Ich habe eine Bearbeitung eingereicht, um hinzuzufügen: 'HATEOAS ist eine Abkürzung für "Hypermedia als Motor des Anwendungsstatus". ' zur Frage.
BDSL
Fangen wir von vorne an. Was verstehen Sie unter "Anwendungsstatus"?
Laiv

Antworten:

9

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.

Filip Milovanović
quelle
Vielen Dank für diese ausführliche Antwort. Kann ich die Aussage aufgreifen, dass der Anwendungsstatus kundenspezifisch ist? So verstehe ich es. Was ich also nicht verstehe, ist, was die HAL-Darstellung, die wir in den Beispielen sehen, mit dem kundenspezifischen Anwendungsstatus zu tun hat. Es hat alles mit der Verfügbarkeit der serverseitigen Ressourcen zu tun, nichts (was ich offensichtlich sehen kann) mit dem Client-Status zu tun ...
GreenAsJade
@ GreenAsJade: Entschuldigung für die späte Antwort, aber ich habe meine Antwort erweitert, um Ihre Frage besser zu beantworten.
Filip Milovanović
10

Wenn Sie REST oder HATEOAS verstehen möchten, sollten Sie zunächst das Web verstehen . HAL ist (effektiv) nur ein Ersatz für HTML; Wenn Sie verstehen, wie HTML "funktioniert", ist es viel einfacher, die Rolle von HAL zu verstehen.

Worauf bezieht sich die "Engine of Application State"?

Kapitel 5 von Fieldings These .

REST wird durch vier Schnittstellenbeschränkungen definiert: Identifizierung von Ressourcen; Manipulation von Ressourcen durch Repräsentationen; selbstbeschreibende Nachrichten; und Hypermedia als Motor des Anwendungsstatus. - Einheitliche Schnittstelle

Der Status einer Anwendung wird daher durch ihre ausstehenden Anforderungen, die Topologie verbundener Komponenten (von denen einige gepufferte Daten filtern können), die aktiven Anforderungen auf diesen Konnektoren, den Datenfluss von Darstellungen als Antwort auf diese Anforderungen und die Verarbeitung dieser Anforderungen definiert Darstellungen, wie sie vom Benutzeragenten empfangen werden. - Datenansicht

Die Modellanwendung ist daher eine Engine, die von einem Zustand zum nächsten wechselt, indem sie die alternativen Zustandsübergänge in der aktuellen Reihe von Darstellungen untersucht und aus ihnen auswählt. Es überrascht nicht, dass dies genau mit der Benutzeroberfläche eines Hypermedia-Browsers übereinstimmt. Der Stil setzt jedoch nicht voraus, dass alle Anwendungen Browser sind. Tatsächlich werden die Anwendungsdetails durch die generische Connector-Schnittstelle vor dem Server verborgen, und daher kann ein Benutzeragent ebenso ein automatisierter Roboter sein, der das Abrufen von Informationen für einen Indexdienst durchführt, ein persönlicher Agent, der nach Daten sucht, die bestimmten Kriterien entsprechen, oder eine Wartung Spider ist damit beschäftigt, die Informationen auf fehlerhafte Referenzen oder geänderten Inhalt zu überwachen - Datenansicht

Überlegen Sie, wie die Google-Suche funktioniert: Sie verwenden ein Lesezeichen, um Ihre lokal zwischengespeicherte Kopie des Suchformulars zu aktualisieren, das Formular zu laden, Ihre Abfrage in das Formular einzugeben, es zu senden und die Ergebnisse zu lesen. Nichts davon benötigte Google- Funktionen, die in den Client integriert waren - alle verwenden HTML-Funktionen. Die im Formular enthaltenen Metadaten teilen dem Browser (über standardisierte Verarbeitungsregeln) mit, wie eine HTTP-Anforderung erstellt werden soll, die eine Darstellung der ruhenden Ressource (auch als Suchergebnisse bezeichnet) zurückgibt.

HAL spielt die gleiche Rolle - ein HAL-fähiger Client kann die Verarbeitungsregeln anwenden, um Verknüpfungen in den Darstellungen zu erkennen und intelligente Dinge mit diesen Verknüpfungen zu tun. Ein JSON-fähiger Client kann dies nicht, da das JSON-Verarbeitungsmodell nichts enthält, was eine Verknüpfung definiert.

VoiceOfUnreason
quelle