HATEOAS

Hypermedia as the Engine of Application State (HATEOAS) zu Deutsch: Hypermedia als Motor des Anwendungs-Zustands, beschreibt einen Quasi-Standard für REST-Architekturen.
Dabei stellt der Server dem Client, von den angenommen wird, dass er keine weiteren Vorkenntnisse über den Service hat, verwandte Services als Links zur Verfügung.
Der Client kann damit theoretisch on Demand weitere Informationen aus den bereits erhaltenen Daten gewinnen.

In der RESTful API erfolgt die Integration auf 2 Ebenen.

Konfiguration auf Code-Ebene

Damit ein neuer RESTful-Service als Typ zur Auswahl bei der REST-Page auftaucht, muss dieser RestfulServiceInterface implementieren.
Um nun zusätzlich die relevanten Links für HATEOAS bereitzustellen, muss zusätzlich das Interface \Brandbox\JoinRestful\Service\Hateoas\Lib\Service\RestfulServiceHateoasInterface implementiert werden.

Dieses Interface stellt die Methode getLink bereit, die vom HATEOAS-Service automatisch aufgerufen wird, um den dem Typ entsprechenden Link zu erhalten.

Interface \Brandbox\JoinRestful\Service\Hateoas\Lib\Service\RestfulServiceHateoasInterface

Methode

Signatur

Parameter

Methode

Signatur

Parameter

getLink

public function getLink(Restful\Lib\Entity\RestPage $restPage, ?int $id = null): string;

RestPage, id des zu Grunde liegenden Datensatzes

Die Standard-Services unter REST-Pages implementieren alle dieses Interface.

Konfiguration auf Anwendungsebene

Damit Links vom HATEOAS-Service gebildet werden können, müssen REST-Pages über Eltern-Kind-Beziehungen miteinander verknüpft werden.

Beispiel

  • Es existieren 4 REST-Pages

    • eine vom Typ Liste für Artikel

    • eine vom Typ Karte für Artikel

    • eine vom Typ Eltern für Artikelgruppe → Artikel

    • eine vom Typ Kinder für Artikel → Artikelvariante

  • Anforderung: die Ergebnisse aus der Liste sollen pro Datensatz einen Link zur Karte des Datensatzes, den Eltern des Datensatzes (Artikelgruppen) sowie den Kindern des Datensatzes (Artikelvarianten) erhalten

  • Konfiguration: die Verknüpfungskette wird logisch von oben nach unten aufgebaut:

    • Die REST-Page vom Typ Eltern erhält als Kind-Datensatz die REST-Page vom Typ Liste

    • Die REST-Page vom Typ Liste erhält als Kind-Datensätze die REST-Page vom Typ Karte und die REST-Page vom Typ Kinder

Schaubild

Eine Beispielresponse könnte wie folgt aussehen:

{ "shopArticleActive": true, "shopArticleName": "Visitenkarte allgemein", "shopArticleSku": "00001", "meta": { "id": 1, "userID": 2, "userTable": "Administrator", "createTime": 1531780172, "changeTime": 1670232447 }, "translations": { "en_GB": { "shopArticleName": "Business Card", "shopArticleSeoDescription": "" }, "fr_DE": { "shopArticleDescription": null, "shopArticleName": null } }, "links": [ "\/rest\/v5\/parentsGroupArticle\/1", "\/rest\/v5\/shopArticleCard\/1", "\/rest\/v5\/childArticleVariant\/1" ] }