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 |
---|---|---|
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"
]
}