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?
Das einzige, was es zu einer echten REST-API macht, ist, alle Einschränkungen zu erfüllen, nicht nur eine einzige.
Das ist der Grund, warum wir die anderen Einschränkungen, die selbsterklärende Botschaft usw. brauchen.
Egal wie Sie es versuchen, Sie müssen Ihre API versionieren. In einem REST-Client müssen Sie noch wissen, wie Sie zu einer Seite gelangen, auf der Sie Aufgaben erledigen möchten, welche Links zu folgen sind und welche Eigenschaften Sie basierend auf dem RDF-Vokabular erfassen müssen, das die Nachricht beschreibt. Wenn Sie etwas aus diesem Vokabular ersetzen oder entfernen müssen, werden wahrscheinlich alle Ihre Clients beschädigt und Sie benötigen eine neue Version. Daher denke ich, dass Sie REST nicht frühzeitig veröffentlichen sollten (und das Modell herausfinden sollten, während Sie die API ständig ändern), da sonst viele Versionen zur Verfügung stehen. Sie benötigen zunächst ein stabiles Domain-Modell, auf dem Sie aufbauen können ...
quelle