2009-09-09 15 views
8

Pracuję nad systemem przedsiębiorstwa, który będzie korzystać z usługi RESTful Web między klientami mobilnymi i centralnym serwerem. RESTful, jak to możliwe, powiedzmy.Usługi sieci Web RESTful: próby osiągnięcia HATEOAS z niestandardowym XML

Moje pytanie dotyczy HATEOAS (hipermedia jako silnika stanu aplikacji) i użycie niestandardowego xml w treści odpowiedzi HTTP.

Ten system nigdy nie będzie kiedykolwiek używany przez klientów publicznych, ale podoba mi się HATEOAS pomysł, aby móc modyfikować wzorce alokacji zasobów po stronie serwera później, bez konieczności rekonfiguracji każdego z klientów niezależnie. Jeśli zdecydujemy, że ze względu na problemy ze skalowaniem musimy rozdzielić funkcję serwera na wiele fizycznych skrzynek, nie ma problemu, zostanie to odzwierciedlone w identyfikatorach URI, które są generowane, gdy klient (lub serwer pod instrukcją od klienta) tworzy nowy zasób .

Nasza domena biznesowa jest bardzo specyficzna i nietypowa. W związku z tym chciałbym użyć niestandardowego XML dla organów podmiotu odpowiedzi HTTP w całej usłudze internetowej, a klient przeanalizuje identyfikatory URI zasobów z xml w celu pozostania na bieżąco informacji o lokalizacjach zasobów, które może wykorzystać podczas modyfikowania własnego stanu aplikacji. Wiem, że to "łamie" część H HATEAOS.

np. gdy klient POSTs transakcji do serwera w celu przetworzenia, serwer może zawierać następujący fragment xml w treści odpowiedzi HTTP 201 (jako część większego dokumentu xml). Serwer będzie również informował klienta o identyfikatorze URI dla nowo utworzonego zasobu transakcji, ale prawdopodobnie będzie on zawarty tylko w nagłówku HTTP lokalizacji.

<resulturi>http://resultserver/results/1234.xml</resulturi> 

Czy to tak źle? Istnieje bardzo mała szansa, że ​​klienci korzystający z tej usługi kiedykolwiek będą obsługiwani przez przeglądarkę. Jakie są inne zalety hypermedia nad dostarczaniem uris jako zwykłego tekstu w xml?

Zgaduję, że mogę przejść do XHTML, ale parser na naszej platformie mobilnej jest o wiele bardziej efektywny z POX.

+1

> Wiem, że to "zrywa" część H HATEAOS. Czy to? Nie wiedziałem, że HATEOAS nakłada ograniczenia na rodzaje treści, z których można korzystać. – trendels

Odpowiedz

9

Co robisz, zwracając adres URL w resulturi to już hipermedia. Jedyny problem polega na tym, że potrzebujesz medium, które mówi klientowi, w jaki sposób sformatowana jest odpowiedź, dzięki czemu może analizować adresy URL w przewidywalny i udokumentowany sposób.

Opcja 1: Utwórz własny typ mediów, taki jak vnd.twoja firma.Resource + xml. Robiąc to stwierdzasz, że typ mediów może być analizowany przez analizator składni XML, ale jest zgodny z pewnymi specjalnymi regułami zdefiniowanymi przez twoją firmę. W tym momencie możesz użyć dowolnego standardu do zdefiniowania linków hipermedialnych (patrz pytanie: this). Jedną z zalet tego rozwiązania jest to, że jeśli za 6 miesięcy zdecydujesz, że chcesz wprowadzić zmiany w formacie XML, możesz utworzyć plik vnd.twojafirma.ResourceV2 + xml i tak długo, jak długo będziesz wystarczająco inteligentny, aby użyć akceptacji. W nagłówku starych klientów możesz płynnie wprowadzić nowy format obok starego, dzięki czemu nowe aplikacje klienckie zaakceptują nowy format.

Opcja 2: Jestem tylko w połowie poważny odnośnie tej opcji, ale rozważałem popychanie nowego mediatypu o nazwie application/hyperxml + xml. Dokument byłby zgodny z tymi samymi regułami co application/xml, ale używałby także do hipermedii XLink. To pozwoliłoby ludziom, którzy używają javascript do parsowania dokumentu XML, aby również korzystać z hipermedii w ustandaryzowany sposób.

Opcja 3: Użyj XHtml. Nie rozumiem, dlaczego twój parser ma problemy z Xhtml, ale wezmę na to twoje słowo.

2

Istnieją dwie ważne informacje, które serwer RESTful będzie musiał przetworzyć żądania, niezależnie od podstawowego języka znaczników: typu multimediów i identyfikatora URI. Założenie typu nośnika dla danego URI wprowadziłoby sprzężenie klient-serwer. Uniemożliwiłoby to na przykład temu samemu URI obsługującemu dwa różne rodzaje mediów.

XML nie jest jedyną opcją podczas projektowania formatów hipermedialnych. Sprawdź kod Sun Cloud API, który definiuje interfejs API REST hypertext-driven oparty na JSON (chociaż wygląda na to, że nie korzysta z typu hiperłączy). Nie jest trudno przejść z tego podejścia do takiego, które łączy typy mediów z hiperlinkami.

Na przykład można zdefiniować strukturę danych JSON o nazwie Link, która wygląda następująco;

{ 
    "name":"human-readable label for link", 
    "uri":"http://example.com/resources/123", 
    "media_type":"application/vnd.com.example.Resource+json" 
} 
2

Hypermedia nie wymaga HTML lub nawet w pełni kwalifikowanych identyfikatorów URI. Jeśli twój typ mediów definiuje regułę przekształcenia niektórych elementów odpowiedzi w zasoby de-referenceable, masz hipermedię.

<result>1234</result> 

powyższym przykładzie, w połączeniu z typu zasady mediów na temat nieprawidłowego zawartości elementu efekt taki hipertekstowy w ten sam sposób:

<result>/foo/1234</result> 

jest z reguły do ​​Dołączenie podstawy http URI. Tak jest w poniższym przykładzie, w którym fakt, że ciąg http może być dereferencable, może być pozostawiony niejawny.

<result>http://myserver.com/foo/1234</result> 

Jednakże, podczas gdy wszyscy są Hypermedia i spełniają to ograniczenie, będę argumentować przeciwko tworzenia własnych nowych zasad produkcji Hypermedia i tagów, jeśli w ogóle możliwe, a istniejące zaledwie ponownego wykorzystania. Pierwszy przykład sprawia, że ​​dla użytkownika jest mniej oczywiste, że ten element reprezentuje zasoby hiperłącza niż ostatni przykład.

+0

Pierwsze dwa przykłady wymagały informacji pozapasmowych dla klienta ... i dlatego nie są RESTOWNOWE. – HDave

+0

W ten sposób znacznik zakotwiczenia działa w HTML-A HREF. Reguły przetwarzania specyficzne dla nośnika dopuszczają względne adresy URL. –

0

Sugeruję, aby zamiast ręcznie kodować te hiperlinki, użyj narzędzia, które tworzy dla Ciebie hiperlink. Programowanie zorientowane na interakcje to dobra metoda tworzenia tych interakcji (hiperłącza). Kliknij ten link technologia ta pracowała dla nas http://www.masterkube.com/hateoas_technology.html

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza.Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. – PKirby

0

w bardzo minimum (nawet jeśli nic innego nie robić), należy umieścić adres URL w atrybucie XLink zamiast zawartości pierwiastków:

<resulturi xlink:href="http://resultserver/results/1234.xml"/> 

XML procesory są w stanie analizować i śledzić je jako identyfikatory URI natywnie. Zasadniczo tekst, który nie podlega tłumaczeniu lub który nigdy nie mógłby mieć podelementów, powinien być atrybutem wymuszającym takie ograniczenia.

Co więcej, zrób to, co inni zasugerowali i zdefiniuj swój typ mediów, aby klienci zrozumieli znaczenie.

Powiązane problemy