Jakie są zalety hipermediów (HATEOAS)?

17

Nie rozumiem korzyści dla HATEOAS dla interfejsów API przeznaczonych do użytku przez programy (w przeciwieństwie do ludzi przeglądających interfejs API bezpośrednio). Jasne, że klient nie jest powiązany ze schematem adresu URL, ale jest związany ze schematem danych, co jest moim zdaniem tym samym.

Załóżmy na przykład, że chcę wyświetlić element zamówienia, załóżmy, że odkryłem lub znam już adres URL zamówienia.

HATEOAS:

order = get(orderURL);
item = get(order.itemURL[5]);

nienawiści nienawiści:

order = get(orderURL);
item = get(getItemURL(order,5));

W pierwszym modelu muszę wiedzieć, że obiekt zamówienia ma pole itemURL. W drugim modelu muszę wiedzieć, jak skonstruować adres URL elementu. W obu przypadkach muszę „wiedzieć” coś z wyprzedzeniem, więc co HATEOAS faktycznie dla mnie robi?

Tempo
źródło
1
get(orderURL);powinienem ci powiedzieć the fact that the order object has an itemURL field.
yannis
Pisząc aplikację kliencką, musisz wcześniej wiedzieć, jakie jest pole.
Tempo
8
W jaki sposób aplikacja ma pobrać przedmiot z zamówienia, jeśli aplikacja nawet nie wie, że zamówienie zawiera przedmiot? Discovery działa w przypadku przeglądania ręcznego, ale nie w przypadku aplikacji automatycznych.
Tempo
Sam człowiek mówi o tym tutaj: roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
Thiago Silva

Odpowiedzi:

6

Jedną różnicą jest to, że schemat jest, mam nadzieję, standardem lub przynajmniej może być ponownie wykorzystany przez innych.

Załóżmy na przykład, że używasz interfejsu API Twittera i chcesz również obsługiwać StatusNet (lub zamiast tego). Ponieważ używają tego samego modelu danych co Twitter, jeśli interfejs API jest zgodny z HATEOAS, teraz wystarczy zmienić główny adres URL. Jeśli tak się nie stanie, musisz teraz zmienić każdy pojedynczy adres URL z kodu.

Oczywiście, jeśli i tak musisz zmienić kod, aby umieścić adres URL punktu wejścia usługi, może to nie wydawać się tak pomocne. Naprawdę świeci, jeśli ten adres URL jest wstawiany dynamicznie; na przykład, jeśli budujesz usługę taką jak Twillio, która będzie współdziałać z własnym interfejsem API użytkownika.

André Paramés
źródło
To interesujący punkt, którego nie wziąłem pod uwagę.
Tempo
@YannisRizos: Hmm, nie wiem, gdzie powiedziałem, że HATEOAS to standard. Powiedziałem, że „ schemat (danych) jest, mam nadzieję, standardem”. W terminologii REST byłby to typ nośnika.
André Paramés
Przy drugim czytaniu masz absolutną rację.
yannis
2
Tak, jeśli założymy, że nazwy rel dla linków są takie same. Ale mówiąc ogólnie, a nie tylko na konkretnym przykładzie, o którym wspominasz, każdy programista na świecie niekoniecznie wybierze te same nazwy dla podobnych lub równoważnych działań. Ta korzyść wynika z faktu, że programiści uzgodnili wspólną nazwę interfejsu i parametry.
derloopkat
8
  1. Eksplorowalny interfejs API: Może to brzmieć trywialnie, ale nie lekceważ potęgi eksplorowanego interfejsu API. Możliwość przeglądania danych znacznie ułatwia programistom klientów tworzenie mentalnego modelu API i jego struktur danych.

  2. Dokumentacja wbudowana: Użycie adresów URL jako relacji między linkami może prowadzić programistów klientów do dokumentacji.

  3. Prosta logika klienta: klient, który po prostu podąża za adresami URL, a nie sam je tworzy, powinien być łatwiejszy do wdrożenia i utrzymania.

  4. Serwer przejmuje własność struktur URL: użycie hipermediów usuwa zakodowaną na stałe wiedzę klienta na temat struktur URL używanych przez serwer.

  5. Przesyłanie zawartości do innych serwisów: Hypermedia jest niezbędna podczas przesyłania zawartości do innych serwerów (na przykład CDN).

  6. Wersjonowanie za pomocą linków: Hypermedia pomaga w wersjonowaniu interfejsów API.

  7. Wiele implementacji tej samej usługi: Hypermedia jest koniecznością, gdy istnieje wiele implementacji tej samej usługi (a jeden klient musi uzyskać dostęp do więcej niż jednej z nich).

Dokładne objaśnienie tych punktów można znaleźć tutaj: http://soabits.blogspot.no/2013/12/selling-benefits-of-hypermedia.html

Jørn Wildt
źródło
> Wyłączanie ładowania treści do innych usług: Hipermedia jest niezbędna, gdy ładuje się zawartość na inne serwery (na przykład CDN). Nie, nie jest. Możesz po prostu zachować te same linki i korzystać z CDN.
Bruno Costa