2012-02-09 20 views
75

Dla startupu SaaS, w który jestem zaangażowany, buduję zarówno RESTful Web API, jak i kilka aplikacji klienckich na różnych platformach, które go zużywają. Wydaje mi się, że mam do czynienia z API, ale teraz zwracam się do klientów. Jak czytałem o odpoczynku, widzę, że kluczowym elementem reszta jest odkrycie, ale nie wydaje się być dużo debaty między dwoma różnymi interpretacjami tego, co naprawdę oznacza odkrycie:Wykrywanie RESTful API Runtime/HATEOAS Projektowanie klienta

  1. Developer discovery: Programista koduje w kliencie obfite ilości szczegółów API, takich jak identyfikator URI zasobu, parametry zapytania, obsługiwane metody HTTP i inne szczegóły, które odkrył podczas przeglądania dokumentów i eksperymentowania z odpowiedziami API. Ten typ wykrywania IMHO wymaga fajnego powiązania i pytania o wersję interfejsu API i prowadzi do twardego sprzężenia kodu klienta z interfejsem API. Nie ma to większego znaczenia niż przy użyciu dobrze udokumentowanego zbioru RPC.

  2. środowiska odkrycie - (. Można przypuszczać, że tylko znajomość rodzajów mediów zajmuje API wyglądu) Aplikacja klient sam jest w stanie dowiedzieć się wszystko, co potrzebne z małym lub żadnym out-of-band informacji linki mogą być gorącym. Ale aby API było bardzo wydajne, wydaje się, że wiele szablonów linków do parametrów zapytań jest potrzebnych, co sprawia, że ​​informacje z poza pasma z powrotem pojawiają się. Są jeszcze inne problemy, o których jeszcze nie pomyślałem, ponieważ nie mam doszedłem do tego punktu w rozwoju. Ale podoba mi się pomysł luźnego sprzężenia.

Wykrywanie czasu pracy wydaje się być świętym graalem REST, ale widzę cenną dyskusję o tym, jak wdrożyć takiego klienta. Prawie wszystkie znalezione źródła REST wydają się zakładać wykrycie programisty. Ktoś wie o niektórych zasobach wykrywania środowiska wykonawczego? Najlepsze praktyki? Przykłady lub biblioteki z prawdziwym kodem? Pracuję w PHP (Zend Framework) dla jednego klienta. Objective-C (iOS) dla drugiego.

Czy odkrywanie Runtime jest realistycznym celem, biorąc pod uwagę obecny zestaw narzędzi i wiedzę w społeczności programistów? Mogę napisać mojego klienta, aby traktował wszystkie URI w nieprzejrzysty sposób, ale jak to zrobić najlepiej, to jest pytanie, szczególnie w przypadku połączeń o niskiej przepustowości. W każdym razie identyfikatory URI są tylko częścią równania. A co z linkiem do szablonów w kontekście Runtime? Co powiesz na komunikowanie się, jakie metody są obsługiwane, poza wysyłaniem dużej liczby żądań OPTIONS?

+2

Po prostu lekceważenie referencji OPCJI. Możesz użyć nagłówka "Zezwól" do przekazania dozwolonych operacji na zasobach poza żądaniem OPCJI. Roy Fielding posunął się nawet do uznania nagłówka jako formy hipertekstu - patrz [tutaj] (http://tech.groups.yahoo.com/group/rest-discuss/message/14432). – paulkmoore

+0

tats a gr8 pytanie, kluczowe kwestie są podane listę odpowiednich metod, czy klient powinien być w stanie tworzyć adresy URL do regularnej operacji CRUD, czy będzie to nazywane "poza pasmem"? Powiedzmy, że jeśli udostępnimy linki do operacji CRUD, to jak robisz "formula" w jsonie? Może być, jeśli przy używaniu określonych typów mediów nie trzeba robić "formularzy", ale wat jest standardowym sposobem odkrywania typów mediów (np. Schematu json), czy proces odkrywania schematu będzie uważany za "nie-z- zespół "dla klientów? – redzedi

+0

xhtml wygląda tak dobrze i płynnie, ale jeśli musisz zrobić json, tat, jak sądzę, jest raczej amorficzny teraz – redzedi

Odpowiedz

33

W tym filmie Jon Moore tworzy ogólny klient za pomocą automatycznego wykrywania środowiska wykonawczego HATEOAS. To jest dość imponująca i warte oglądania:

http://oredev.org/oredev2010/2010/sessions/hypermedia-apis.html

+2

to kod "klienta" dostępny gdzieś? nie widzę tam żadnego kodu klienta, on po prostu używa swojego klienta w przykładach java – Denny1989

+1

@ Denny1989 Myślę, że to jest kod źródłowy: https://github.com/cimlabs/hypermedia-client-java – dbank

19

jest to z pewnością trudny orzech do zgryzienia. W Google wdrożyliśmy naszą usługę wykrywania, z której zbudowane są wszystkie nasze nowe interfejsy API. Wersja TL; DR generuje specyfikację podobną do schematu JSON, którą nasi klienci mogą analizować - wiele z nich dynamicznie.

To oznacza łatwiejsze aktualizacje SDK dla programisty i łatwą/lepszą konserwację dla nas.

Pod żadnym pozorem nie jest to idealne rozwiązanie, ale wielu naszych twórców zdaje się lubić.

Zobacz link więcej szczegółów (i upewnij się, aby obejrzeć vid.)

+0

Czy istnieje jakiś standard do wdrożenia takiej usługi wykrywania dla naszych własnych API? –

11

fascynujące. To, co opisujesz, jest zasadniczo zasadą HATEOAS. Co to jest HATEOAS, o które pytasz?Przeczytaj to: http://en.wikipedia.org/wiki/HATEOAS

W rozumieniu laika, HATEOAS oznacza następujący link. Takie podejście oddziela klienta od określonych adresów URL i daje Ci elastyczność, aby zmienić interfejs API bez niszczenia nikogo.

+0

Dzięki za przypomnienie mi o HATEOAS. To wydaje się być słowem kluczowym, którego mi brakowało, aby pomóc mi dowiedzieć się, co zrobić z moimi interfejsami klienckimi. (Człowieku, naprawdę nie podoba mi się ten akronim!) Natknąłem się na HATEOAS wcześniej i wydaje mi się, że przyswoiłem sobie, co to znaczyło, ale zapomniałem użyć nazwy w moich poszukiwaniach. Widzę teraz dużo zasobów, które dają mi lepszy obraz, a niektórzy mają nadzieję, że mimo wszystko nie jest to nieosiągalne. – curtisdf

+0

ios próbek? co wybrałeś? w pewnym momencie musisz wiedzieć, czego szukasz! więc musisz znać API, więc musisz trochę zakodować! – Vassily

+0

@curtisdf Całkowicie wyłączony z tematu, ale zamiast mówić, że naprawdę nie lubisz tego, powinieneś powiedzieć NIENAWIDZIE-to ... HATE-OAS ... :) Przepraszamy, nie mogłem się oprzeć – jamiebarrow

1

Myślę, że ważnym punktem o hateoas nie jest to, że jest jakiś święty graal po stronie klienta, ale że izoluje klient ze zmian URI - zakłada używasz znanych (lub odkrytych niestandardowych) relacji między linkami, które pozwolą systemowi wiedzieć, który link dla obiektu jest formą edytowalną. Ważne jest, aby użyć typu emdia, który jest świadomy hipermedii (np. HTML, XHTML itp.).

0

Piszesz:

Aby API bardzo wydajny, dużo linków szablonów dla parametrów zapytania wydaje się być potrzebnym, co powoduje, że informacje z poziomu poza pasmem znów pojawiają się.

Jeśli ten szablon łącza jest dostarczany we wcześniejszym żądaniu, to nie ma informacji poza pasmem. Na przykład formularz wyszukiwania HTML używa szablonu linku (/search?q=%@) do generowania adresu URL (/search?q=hateoas), ale klient nie zna nic (przeglądarki internetowej) poza tym, jak korzystać z formularzy HTML i GET.

+0

rzeczywiście nie ma informacji o zespole - klient jest odpowiedzialny za rozwinięcie szablonów uri przy użyciu dostarczonych danych zasobów/instancji (i powinien wiedzieć, jak to zrobić) - http://json-schema.org/latest/json-schema-hypermedia. html # anchor18 – fusi

3

Jednym z wymagań, które należy spełnić, zanim będzie można wywołać interfejs API "RESTful", jest to, że powinno być możliwe zapisanie ogólnej aplikacji klienckiej poza tym interfejsem API. W przypadku ogólnego klienta użytkownik powinien mieć dostęp do wszystkich funkcjonalności interfejsu API. Klient ogólny to aplikacja kliencka, która nie zakłada, że ​​dowolny zasób ma określoną strukturę wykraczającą poza strukturę zdefiniowaną przez typ nośnika. Na przykład przeglądarka internetowa to ogólny klient, który wie, jak interpretować HTML, w tym formularze HTML itp.

Załóżmy teraz, że mamy interfejs API HTTP/JSON dla sklepu internetowego i chcemy zbudować HTML/CSS/Klient JavaScript, który zapewnia naszym klientom doskonałą obsługę. Czy realistycznym rozwiązaniem byłoby, aby klient ten był aplikacją kliencką generic? Nie. Chcemy zapewnić określony wygląd i każdy element danych i każdy konkretny stan aplikacji. Nie chcemy włączać całej wiedzy o tej prezentacji w API, wręcz przeciwnie, klient powinien zdefiniować wygląd i sposób działania, a interfejs API powinien tylko przenosić dane. Oznacza to, że klient ma zakodowane na sztywno sprzężenie określonych elementów zasobów z konkretnymi układami i interakcjami użytkownika.

Czy to koniec HATEOAS, a więc koniec REST? Tak i nie.

Tak, ponieważ jeśli twardo kodujemy wiedzę o API w kliencie, tracimy korzyść z HATEOAS: zmiany po stronie serwera mogą przerwać klienta.

nr, z dwóch powodów:

  1. Bycie "Spokojny" jest właściwością API, a nie klienta. Tak długo, jak jest to możliwe, w celu uzyskania ogólnego klienta, który oferuje wszystkie możliwości interfejsu API, można nazwać RESTful. Fakt, że klienci nie przestrzegają zasad, nie jest winą API. Fakt, że ogólny klient miałby kiepski interfejs użytkownika, nie stanowi problemu. Dlaczego ważne jest, aby wiedzieć, że to możliwe mieć klienta ogólnego, jeśli nie mamy tego klienta ogólnego? To prowadzi mnie do drugiego powodu:
  2. Interfejs API RESTful oferuje klientom opcję wyboru sposobu, w jaki mają być generowani, tj. Jak odporni na zmiany po stronie serwera chcą być. Klienci, którzy muszą zapewnić doskonałą obsługę, mogą być odporni na zmiany identyfikatorów URI, zmiany wartości domyślnych i więcej. Klienci wykonujący zadania wsadowe bez interakcji użytkownika mogą być odporni na inne rodzaje zmian.

Jeśli są Państwo zainteresowani praktycznymi przykładami, proszę sprawdzić moje JAREST paper. Ostatnia sekcja dotyczy HATEOAS. Przekonasz się, że dzięki JAREST nawet wysoce interaktywni i atrakcyjni wizualnie klienci mogą być odporni na zmiany po stronie serwera, ale nie w 100%.

Powiązane problemy