Ostatnio czytałem o Hypermedia jako silniku stanu aplikacji (HATEOAS), ograniczeniu, które, jak się twierdzi, sprawia, że interfejs API sieci Web jest „naprawdę RESTful”. Sprowadza się to zasadniczo do uwzględnienia łączy z każdą odpowiedzią na możliwe przejścia, które możesz wykonać z bieżącego stanu.
Pozwól mi zilustrować, co HATEOAS opiera się na moim zrozumieniu - i proszę popraw mnie, jeśli coś przeoczyłem.
/
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 ma zapewniać dwie główne korzyści:
Cała usługa jest wykrywalna, począwszy od głównego identyfikatora URI, dokumentacja nie jest już potrzebna.
Klient jest oddzielony od serwera, który może teraz dowolnie zmieniać strukturę URI. Eliminuje to potrzebę wersjonowania interfejsu API.
Ale moim zdaniem usługa to znacznie więcej niż jej struktura URI. Aby skutecznie go używać, musisz także wiedzieć:
- jakich parametrów zapytania można użyć i ich możliwych wartości
- struktura JSON / XML / dowolne dokumenty, które musisz wysłać w swoich żądaniach POST / PATCH / etc
- struktura odpowiedzi wysłanej przez serwer
- możliwe błędy, które mogą wystąpić
- ...
W oparciu o powyższe, HATEOAS rozwiązuje tylko niewielką część problemów związanych z wykrywalnością i sprzężeniem. Nadal musisz udokumentować powyższe cztery aspekty, a dzięki temu klienci nadal będą silnie powiązani z serwerem. Aby uniknąć łamania klientów, nadal musisz zaktualizować swój interfejs API.
Jedyną korzyścią, jaką zapewnia, jest to, że możesz mniej lub bardziej swobodnie zmieniać strukturę adresów URL (tak przy okazji, co stało się z zasadą „Fajne URI się nie zmieniają” ?). Czy moje rozumowanie jest prawidłowe?