W języku REST jaka jest różnica między zasobem a reprezentacją?

9

Moje rozumienie REST, które umożliwia modelowanie operacji usługi jako reprezentacji stanu i przechodzenia z jednego stanu do drugiego z wykorzystaniem HTTP. Do niedawna zawsze rozumiałem zasoby jako reprezentacje stanu usługowego, kiedy czytałem ten artykuł Jimmy'ego Bogarda, o którym wiem, że jest inteligentnym programistą / architektem, którego społeczność bardzo szanuje. Cytując konkretne oświadczenie z tego postu

Reprezentacja jest nieco inna - opisuje aktualny stan zasobu (na żądanie).

To mnie zdezorientowało. Jaka jest ogólnie akceptowana opinia na ten temat?

Suhas
źródło
1
Może chcesz sprawdzić: o jakie tematy mogę tutaj zapytać? . Ankiety opinii nie są na temat dla Programmers.SE.
Adam Zuckerman
2
Cóż, wszystko wymienione na tej stronie nie ma odpowiedzi w czerni i bieli, ale wszystkie opinie. Nie jestem też pewien, jak to pytanie dotyczy opinii. Czy tylko dlatego, że użyłem słowa „opinia” w moim pytaniu?
Suhas
Przede wszystkim tak. Niestety (a może na szczęście) słowa „opinia”, „najlepsza praktyka” i tym podobne zostały silnie powiązane z „pustą jamą rezonansową, w której powinien znajdować się mózg”, ponieważ większość ludzi, którzy używają takich określeń, po prostu chcą dostrzec stado w oddali i biegnij za nim. Ludzie szukający definicji słów są często najgorszymi przestępcami. Jaki konkretny problem próbujesz rozwiązać?
Robert Harvey
1
Jeśli chodzi o twoje pytanie, zasób to po prostu „coś w Internecie z adresem”, podczas gdy reprezentacja to „sposób, w jaki rzecz w Internecie jest prezentowana ponownie”. Może to być plik, strona internetowa lub dokument JSON. Może to być określony rodzaj pliku, na przykład dokument Word lub arkusz kalkulacyjny. We wszystkich tych przypadkach reprezentacja jest tym, co pobierasz. „Bieżący stan zasobu” oznacza rozpoznanie, że rzecz mogła się zmienić od ostatniego pobrania.
Robert Harvey

Odpowiedzi:

14

Krótka odpowiedź

Mapa nie jest terytorium.

Już odpowiedź - jak z niczego REST, miejscem do rozpoczęcia jest z Roy Fielding tezy ; w szczególności rozdział 5 . W przypadku twojego obecnego pytania, chcesz sekcja 5.2.1.

REST jest zdefiniowany przez cztery ograniczenia interfejsu: identyfikacja zasobów; manipulowanie zasobami poprzez reprezentacje; komunikaty opisowe; oraz hipermedia jako silnik stanu aplikacji.

Ratunek

Kluczowa abstrakcja informacji w REST jest zasobem. Wszelkie informacje, które można nazwać, mogą być zasobem: dokumentem lub obrazem, usługą doczesną (np. „Dzisiejsza pogoda w Los Angeles”), zbiorem innych zasobów, obiektem niebędącym przedmiotem wirtualnym (np. Osobą) i tak dalej . Innymi słowy, każda koncepcja, która może być celem hipertekstowego odwołania autora, musi mieścić się w definicji zasobu. Zasób jest koncepcyjnym odwzorowaniem na zestaw jednostek, a nie na jednostkę, która odpowiada odwzorowaniu w danym momencie.

Reprezentacja

Komponenty REST wykonują działania na zasobie, używając reprezentacji do przechwycenia bieżącego lub zamierzonego stanu tego zasobu i przeniesienia tej reprezentacji między komponentami. Reprezentacja to sekwencja bajtów plus metadane reprezentacji opisujące te bajty. Inne powszechnie używane, ale mniej precyzyjne nazwy reprezentacji to: dokument, plik i jednostka komunikatu HTTP, instancja lub wariant.

Reprezentacja składa się z danych, metadanych opisujących dane, a czasami metadanych opisujących metadane (zwykle w celu weryfikacji integralności wiadomości).

Tak więc: „dzisiejsza pogoda w Los Angeles” jest zasobem. Przedstawienia kandydatów obejmowałyby: dokument tekstowy z najnowszą prognozą z krajowej służby meteorologicznej; wizualna reprezentacja radaru pogodowego i zapis audio prognozy.

VoiceOfUnreason
źródło
2

Zasób to rzecz, nad którą pracujesz. Na przykład, jeśli masz interfejs API do przełączania określonej lampy, wówczas zasobem jest sama lampa. Zasób może być fizyczny (np. Lampa, osoba) lub niefizyczny (np. Artykuł, rola, wiersz w bazie danych), zasób może być pierwotny (np. Saldo) lub pochodny (np. Transakcja). Zasób może odnosić się do konkretnej jednostki (np. Piąta lampa zainstalowana w tym gnieździe lampy) lub może odnosić się do roli, która mapuje do innej jednostki w różnym czasie (np. Aktualnie zainstalowana lampa, lampa zainstalowana 5 sierpnia 2008 r.) lub może mapować do wielu podmiotów (np. wszystkich lamp w domu).

Reprezentacja zasobu to sposób, w jaki usługa komunikuje stan zasobu, np. XML, JSON, który reprezentuje stan lampy.

W interfejsie API REST zasób jest identyfikowany przez jednolity identyfikator (np. URI). Pojedynczy zasób może mieć wiele reprezentacji, w interfejsie API REST HTTP normalnie wskazujesz reprezentację, której chcesz użyć w nagłówku HTTP Content-Type i Accept.

Jedną z kluczowych realizacji w architekturze serwera klienta jest to, że nie można dostarczyć zasobu do klienta i nie powinieneś próbować tworzyć go tak, jak robisz. Zamiast tego w interfejsie API REST można zdalnie manipulować zasobem, przesyłając jego reprezentacje. Pomyśl o tym w ten sposób, że nie FedEx lampy, aby klient mógł bezpośrednio manipulować lampą, ale usługa tworzy reprezentację lampy XML / JSON / protobuf / CSV, a klient wysyła reprezentację zamierzonych manipulacji. Usługa następnie manipuluje rzeczywistym stanem lampy w imieniu klienta lub odrzuca żądanie, na przykład jeśli klient nie jest upoważniony do wykonywania operacji na lampie. Może to wydawać się oczywiste / rozdwajające włosy, ale należy zauważyć, że ponieważ reprezentacja nie jest samym zasobem,

Lie Ryan
źródło
1

Zasób może być fakturą.

Reprezentacja jest fakturą w określonym momencie w formacie JSON lub XML. Później możesz otrzymać tę samą fakturę, będzie to ten sam zasób, ale w potencjalnie innym stanie (anulowany, zapłacony itp.).

Bierzesz bieżący stan faktury (np .: wszystkie dane faktury w bazie danych) i nadajesz jej konkretną reprezentację (np .: html, xml, json) w określonym momencie, aby przenieść ją na inne urządzenie (np .: przeglądarka)

Bryan Oakley
źródło