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?
Jedyne, co czyni go prawdziwym interfejsem API REST, to spełnianie wszystkich ograniczeń, a nie tylko jednego.
Dlatego potrzebujemy innych ograniczeń, samoopisowego komunikatu itp.
Bez względu na to, jak spróbujesz, musisz zaktualizować interfejs API. W kliencie REST nadal musisz wiedzieć, jak dostać się do strony, na której chcesz robić rzeczy, które linki należy śledzić i jakie właściwości musisz zebrać na podstawie słownika RDF opisującego komunikat. Jeśli musisz wymienić lub usunąć coś z tego słownika, prawdopodobnie spowoduje to uszkodzenie wszystkich twoich klientów i będziesz potrzebować nowej wersji. Myślę więc, że REST nie jest czymś, co powinieneś opublikować wcześniej (i wymyśl model, gdy ciągle zmieniasz API), w przeciwnym razie będziesz mieć wiele wersji. Najpierw potrzebujesz stabilnego modelu domeny, na którym możesz ...
źródło