In letzter Zeit habe ich über Hypermedia als Engine of Application State (HATEOAS) gelesen, die Einschränkung, die behauptet wird, eine Web-API "wirklich RESTful" zu machen. Es läuft darauf hinaus, Verknüpfungen mit jeder Antwort auf die möglichen Übergänge, die Sie vom aktuellen Status aus vornehmen können, zu berücksichtigen.
Lassen Sie mich veranschaulichen, was HATEOAS auf meinem Verständnis basiert - und bitte korrigieren Sie mich, wenn ich etwas verpasst habe.
/
GET: {
"_links": {
"child": [
{ "href": "http://myapi.com/articles", "title": "articles" }
]
}
}
/articles?contains=HATEOAS
GET: {
"_items": [
{ "uri": "http://myapi.com/articles/0", "title": "Why Should I Care About HATEOAS?" },
{ "uri": "http://myapi.com/articles/1", "title": "HATEOAS: Problem or Solution?" }
],
"_links": {
"self": { "href": "http://myapi.com/articles", "title": "articles" },
"parent": { "href": "http://myapi.com/", "title": "home" }
}
}
POST: {
"title": "A New Article",
"body": "Article body",
"tags": [ "tag1", "tag2" ]
}
/articles/0
GET: {
"title": "Why Should I Care About HATEOAS?",
"body": "Blah blah blah"
"tags": [ "REST", "HATEOAS" ],
"_links": {
"self": { "href": "http://myapi.com/articles/0", "title": "article" },
"parent": { "href": "http://myapi.com/articles", "title": "articles" }
}
}
HATEOAS soll zwei wesentliche Vorteile bieten:
Der gesamte Dienst ist ab dem Root-URI erkennbar, eine Dokumentation ist nicht mehr erforderlich.
Der Client ist vom Server entkoppelt, der nun die URI-Struktur frei ändern kann. Dadurch entfällt die API-Versionierung.
Aus meiner Sicht ist ein Service jedoch viel mehr als seine URI-Struktur. Um es effektiv zu nutzen, müssen Sie auch wissen:
- Welche Abfrageparameter können Sie verwenden und deren mögliche Werte
- die Struktur des JSON / XML / aller Dokumente, die Sie zum Senden Ihrer POST / PATCH / etc-Anforderungen benötigen
- die Struktur der vom Server gesendeten Antwort
- die möglichen Fehler, die auftreten können
- ...
Auf dieser Grundlage löst HATEOAS nur einen winzigen Bruchteil der Entdeckbarkeits- und Kopplungsprobleme. Sie müssen die vier oben genannten Aspekte noch dokumentieren, und die Clients sind aufgrund dieser Aspekte weiterhin stark mit dem Server verbunden. Um zu vermeiden, dass Clients beschädigt werden, müssen Sie Ihre API noch versionieren.
Der einzige Vorteil ist, dass Sie Ihre URL-Struktur mehr oder weniger frei ändern können (übrigens, was ist mit dem Prinzip "Coole URIs ändern sich nicht" passiert ?). Ist mein Verständnis korrekt?