Hypermedia as the Engine of Application State (HATEOAS) zu Deutsch: Hypermedia als Motor des Anwendungs-Zustands, ist eine Einschränkung der REST-Anwendungsarchitektur.

Mit HATEOAS interagiert ein Client mit einer Netzwerkanwendung, deren Anwendungsserver Informationen dynamisch über Hypermedien bereitstellen. Ein REST-Client benötigt kaum oder nur wenige Vorkenntnisse über die Interaktion mit der Anwendung oder dem Server, sondern nur Basiswissen von Hypermedien (siehe HTTP).

Im Gegensatz dazu interagieren Clients und Server in der CORBA (Common Object Request Broker Architecture) über eine feste Schnittstelle, die über die Dokumentation oder eine Schnittstellenbeschreibungssprache (Interface Description Language, kurz: IDL) gemeinsam genutzt wird.

Die von HATEOAS auferlegten Einschränkungen entkoppeln Client und Server. Dadurch kann die Serverfunktionalität unabhängig von Clients weiterentwickelt werden.

Beispiel

Bearbeiten

Ein User-Agent, der HTTP implementiert, stellt eine HTTP-Anforderung einer REST API über eine einfache URL. Alle nachfolgenden Anforderungen, die der User-Agent möglicherweise stellt, werden in den Antworten auf jede Anforderung erkannt. Die für diese Repräsentationen verwendeten Medientypen und die darin enthaltenen Verknüpfungsbeziehungen sind standardisiert. Der Client wechselt durch Anwendungszustände, indem er aus den Links innerhalb einer Repräsentation auswählt oder die Repräsentation auf andere Weise bearbeitet, die der Medientyp bietet. Auf diese Weise wird die RESTful-Interaktion eher durch Hypermedien als durch Out-of-Band-Informationen gesteuert.[1]

Diese GET-Anforderung ruft beispielsweise eine Kontoressource ab und fordert Details in einer JSON-Darstellung an:[2]

GET /accounts/12345 HTTP/1.1
Host: bank.example.com
Accept: application/vnd.acme.account+json
...

Die Antwort darauf lautet:

HTTP/1.1 200 OK
Content-Type: application/vnd.acme.account+json
Content-Length: ...

{
    "account": {
        "account_number": 12345,
        "balance": {
            "currency": "usd",
            "value": 100.00
        },
        "links": {
            "deposit": "/accounts/12345/deposit",
            "withdraw": "/accounts/12345/withdraw",
            "transfer": "/accounts/12345/transfer",
            "close": "/accounts/12345/close"
        }
    }
}

Die Antwort enthält diese möglichen Weiterverfolgungs-Links (follow up links): Einzahlung (deposit), Auszahlung (withdraw), Überweisung (transfer) oder schließen des Kontos (close). Wenn die Kontoinformationen später abgerufen werden, ist das Konto überzogen:

HTTP/1.1 200 OK
Content-Type: application/vnd.acme.account+json
Content-Length: ...

{
    "account": {
        "account_number": 12345,
        "balance": {
            "currency": "usd",
            "value": -25.00
        },
        "links": {
            "deposit": "/accounts/12345/deposit"
        }
    }
}

Jetzt ist nur noch ein Link verfügbar: um mehr Geld einzuzahlen. Im aktuellen Zustand sind die anderen Links nicht verfügbar. Daher kommt der Begriff Engine of Application State (zu Deutsch: Motor des Anwendungs-Zustands). Welche weitere Aktionen möglich seien, hängt vom Zustand der Ressource ab.

Ein Client muss nicht alle vom Server angebotenen Medientypen und Kommunikationsmechanismen verstehen. Die Fähigkeit, neue Medientypen zu verstehen, kann zur Laufzeit durch „code-on-demand“ (zu Deutsch: Code auf/nach Anfrage) erworben werden, das dem Client vom Server bereitgestellt wird.

Ursprung

Bearbeiten

Die HATEOAS-Einschränkung ist ein wesentlicher Bestandteil der Funktion einheitliche Schnittstelle (Uniform Interface) von REST, wie sie in der Doktorarbeit von Roy Fielding definiert ist. Fielding hat das Konzept in seinem Blog weiter beschrieben.[1]

Fielding erklärt die Striktheit dieser und anderer REST-Einschränkungen wie folgt: „Software-Entwurf im Maßstab von Jahrzehnten heißt: jedes Detail beabsichtigt die Förderung von Langlebigkeit und unabhängige Weiterentwicklung von Software. Viele der Einschränkungen stehen entgegen der kurzfristigen Effizienz. Leider sind die Leute ziemlich gut im kurzfristigen Entwurf, und normalerweise schrecklich im langfristigen Entwurf“.[1]

Implementierungen

Bearbeiten

Siehe auch

Bearbeiten

Einzelnachweise

Bearbeiten
  1. a b c Roy T. Fielding: REST APIs must be hypertext-driven. 20. Oktober 2008, abgerufen am 20. Mai 2010 (englisch).
  2. Joshua Thijssen: What is HATEOAS and why is it important for my REST API? In: REST CookBook. 29. Oktober 2016, abgerufen am 5. Februar 2020 (englisch).