Czy istnieją strategie odkrywania usług REST za pomocą HATEOAS?


10

Podczas budowania usługi REST z ograniczeniem HATEOAS bardzo łatwo jest ogłosić istnienie zasobów poprzez łączenie. Robisz GETdo katalogu głównego mojej witryny, a ja odpowiadam dokumentem głównym z listą wszystkich zasobów pierwszego poziomu:

{
    users: { href: "/users" }
    questions { href: "/questions" }
}

Klienci, którzy rozumieją, jak odczytać te hrefwartości, mogą wykonywać GETna nich żądania i odkrywać wszystkie bieżące zasoby dostępne w aplikacji.

Działa to dobrze w podstawowych scenariuszach wyszukiwania, ale nie wskazuje, czy zasób ma możliwość zapytania. Na przykład rozsądne może być wykonanie:

GET /users?surname=Smith

Czy są jakieś formaty, które mogłyby wyrazić tę zdolność zapytania przy wystarczającej ilości informacji, aby klient mógł utworzyć spójne zapytanie bez konieczności wcześniejszej wiedzy o zasobie?

Ponadto, czy jest jakiś sposób, aby wyrazić, że klient może wykonać POSTokreśloną lokalizację w oczekiwanej lokalizacji. Na przykład można oczekiwać, że klient wykona następujące czynności, aby utworzyć nowy zasób pytań:

POST /questions

{
    title: "Are there strategies for discovering REST services using HATEOAS?",
    body: "When building a REST service with the HATEOAS constraint, it's very..."
}

Używając HTML jako formatu do spożycia przez ludzi, możemy wyrazić wiele z tego, korzystając z formularzy i pisemnych podpowiedzi, aby umożliwić człowiekowi odkrycie operacji, które mogą wykonywać w usłudze.

Czy istnieją formaty zdolne do podobnych rzeczy dla klientów?


2
Problem z odnajdywaniem usługi REST został omówiony i rozwiązany tutaj: stackoverflow.com/questions/9101494/ ... Najprostszym rozwiązaniem jest użycie szablonu XHTML z formularzem, który nie tylko powie o metodzie, której możesz użyć, ale także o struktura obiektu wysyłana przez elementy formularza (wejście, wybór itp.). Klienci potrzebują tylko parsera XML, aby znaleźć to, czego potrzebują. Innym sposobem są szablony adresów URL, ale pomagają one tylko w przypadku zasobów, które pobierają ciągi zapytań.
Spoike

W odniesieniu do typów treści; rozwiązuje się to za pomocą negocjacji treści przeprowadzanych w nagłówkach HTTP. Jeśli serwer nie może obsłużyć żądanego typu treści, powinien zwrócić błąd HTTP (np. 300 lub 406) wskazujący, które typy treści może zwrócić.
Spoike

Odpowiedzi:


1

Skąd miałbyś wiedzieć, jakie dane wejściowe są dopuszczalne? To znaczy, jeśli twój klient nie ma wcześniejszej wiedzy, jak zdefiniowałbyś semantykę „nazwiska”? Zaczynasz dostawać się na terytorium, potrzebując czegoś takiego jak OWL .

Myślę, że bardziej praktyczne jest oczekiwanie od klientów zrozumienia semantyki dobrze znanych typów mimów; powiedzmy na przykład „text / vcard” dla ludzi.


Myślę, że najlepszym rozwiązaniem jest użycie typu zawartości; Mogę z łatwością zmienić aplikację application/atomapp+xmli używać ją dla wszystkich klientów, którzy już rozumieją ten format. Prawdopodobnie istnieje wystarczająco dużo znanych rodzajów treści, aby uczynić to praktycznym rozwiązaniem.
Paul Turner

Myślę, że komentarz @Spoike to eleganckie podejście REST-ian do drugiej połowy problemu; nawet jeśli klient wie, że (na przykład) użytkownik jest reprezentowany jako vCard, nadal musi wiedzieć, jaki podzbiór właściwości użytkownika jest dostępny do wyszukiwania.
Stephen J. Anderson

4

Możesz publikować szczegółowe informacje o swoich usługach poprzez „WADL”

http://en.wikipedia.org/wiki/Web_Application_Description_Language

Jest to opcjonalne i nie każda technologia REST zaplecza to obsługuje. Jersey, „oficjalna” implementacja java-rs w Javie, obsługuje ją na przykład - można ją wygenerować automatycznie.

Jest to jednak dość rzadkie, aby zobaczyć, że jest używany.

Nie znam dużych, którzy go używają. Ogólnie masz stronę internetową opisującą interfejs.


1
CXF to kolejna duża implementacja Java JAX-RS, która obsługuje WADL, a teraz zaczynasz widzieć także kilku interesujących zewnętrznych klientów WADL.
Donal Fellows

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.