Kanarek w kopalni węgla.
Na takie pytanie czekałem blisko rok. To było nieuniknione, że ten dzień nadejdzie i jestem pewien, że takich pytań zobaczymy o wiele więcej w nadchodzących miesiącach.
Znaki ostrzegawcze
Masz całkowitą rację, budowanie klientów RESTful trwa dłużej niż klientów SOAP. Zestawy narzędzi SOAP zabierają dużo standardowego kodu i sprawiają, że obiekty proxy klienta są dostępne prawie bez wysiłku. Za pomocą narzędzia takiego jak Visual Studio i adres URL serwera mogę uzyskać dostęp do zdalnych obiektów o dowolnej złożoności lokalnie w mniej niż pięć minut.
Usługi, które zwracają application / xml i application / json są bardzo denerwujące dla programistów-klientów. Co mamy zrobić z tą plamą danych?
Na szczęście wiele witryn oferujących usługi REST udostępnia również kilka bibliotek klienckich, dzięki czemu możemy użyć tych bibliotek, aby uzyskać dostęp do wielu obiektów o jednoznacznie określonym typie. Choć wydaje się to trochę głupie. Gdyby używali SOAP, moglibyśmy sami wygenerować kod dla tych klas proxy.
Narzut mydła, ha. To opóźnienie zabija. Jeśli ludzie są naprawdę zaniepokojeni liczbą nadmiarowych bajtów przesyłanych przez sieć, być może HTTP nie jest właściwym wyborem. Czy widziałeś, ile bajtów jest używanych przez nagłówek klienta użytkownika?
Tak, czy kiedykolwiek próbowałeś używać przeglądarki internetowej jako narzędzia do debugowania czegokolwiek innego niż HTML i JavaScript. Zaufaj mi, to jest do bani. Możesz użyć tylko dwóch czasowników, buforowanie ciągle przeszkadza, obsługa błędów pochłania tyle informacji, że ciągle szuka cholernego favicon.ico. Po prostu mnie zastrzel.
Czytelny adres URL. Tylko rzeczowniki, bez czasowników. Tak, to proste, o ile wykonujemy tylko operacje CRUD i musimy uzyskać dostęp do hierarchii obiektów tylko w jeden sposób. Niestety większość aplikacji wymaga nieco większej funkcjonalności.
Zbliżająca się katastrofa
Istnieje pewna liczba programistów, którzy obecnie opracowują aplikacje integrujące się z usługami REST, którzy dochodzą do tego samego zestawu wniosków, co Ty. Obiecano im prostotę, elastyczność, skalowalność, możliwość rozwoju i święty Graal nieoczekiwanego ponownego wykorzystania. Charakterystyka samej sieci, jak coś może pójść nie tak.
Jednak odkrywają, że przechowywanie wersji jest równie dużym problemem, ale kompilator nie pomaga w wykrywaniu problemów. Odręczny kod klienta jest trudny w utrzymaniu, ponieważ struktury danych ewoluują, a adresy URL są refaktoryzowane. Projektowanie interfejsów API w oparciu o same rzeczowniki i cztery czasowniki może być naprawdę trudne, zwłaszcza gdy zeloty RESTful Url mówią ci, kiedy możesz, a kiedy nie możesz używać ciągów zapytań.
Programiści zaczną pytać, dlaczego marnujemy wysiłek na obsługę zarówno formatów Json, jak i formatów Xml, dlaczego nie skupić się tylko na jednym i zrobić to dobrze?
Jak poszło tak źle
Powiem ci, co poszło nie tak. Jako programiści pozwalamy działom marketingu wykorzystać naszą główną słabość. Nasze wieczne poszukiwania srebrnej kuli zaślepiły nas na rzeczywistość tego, czym naprawdę jest REST. Z pozoru REST wydaje się taki łatwy i prosty. Nazwij swoje zasoby za pomocą adresów URL i użyj funkcji GET, PUT, POST i DELETE. Do diabła, my, programiści, już wiemy, jak to zrobić, od lat mamy do czynienia z bazami danych, które mają tabele i kolumny oraz instrukcje SQL, które mają SELECT, INSERT, UPDATE i DELETE. To powinien być kawałek ciasta.
Istnieją inne części REST, które niektórzy omawiają, takie jak samoopisywanie i ograniczenie hipermedialne, ale te ograniczenia nie są tak proste, jak identyfikacja zasobów i jednolity interfejs. Wydaje się, że dodają złożoności, gdzie pożądanym celem jest prostota.
Ta rozwodniona wersja REST została sprawdzona w kulturze programistów na wiele sposobów. Stworzono struktury serwerowe, które zachęcały do identyfikacji zasobów i jednolitego interfejsu, ale nie wspierały innych ograniczeń. Pojęcia zaczęły krążyć wokół różnicując podejścia (HI-REST vs LO-REST, Corporate REST vs Academic REST, REST vs RESTful).
Kilka osób krzyczy, że jeśli nie zastosujesz wszystkich ograniczeń, to nie jest to REST. Nie uzyskasz korzyści. Nie ma połowy REST. Ale te głosy zostały nazwane religijnymi fanatykami, którzy byli zdenerwowani, że ich cenny termin został wykradziony z zapomnienia i wprowadzony do głównego nurtu. Zazdrośni ludzie, którzy starają się, aby REST brzmiał trudniej niż jest.
Termin REST zdecydowanie stał się głównym nurtem. Prawie każda większa usługa internetowa z interfejsem API obsługuje „REST”. Twitter i Netflix to dwa bardzo znane. Przerażające jest to, że mogę pomyśleć tylko o jednym publicznym API, które jest samoopisowe, i jest kilka, które naprawdę implementują ograniczenie hipermedialne. Z pewnością niektóre witryny, takie jak StackOverflow i Gowalla, obsługują linki w swoich odpowiedziach, ale w ich linkach są ogromne luki. Interfejs API StackOverflow nie ma strony głównej. Wyobraź sobie, jak skuteczna byłaby witryna internetowa, gdyby nie było jej strony głównej!
Obawiam się, że zostałeś wprowadzony w błąd
Jeśli dotarłeś tak daleko, krótką odpowiedzią na twoje pytanie jest to, że te interfejsy API (Netflix i Twitter) nie spełniają wszystkich ograniczeń i dlatego nie uzyskasz korzyści, jakie mają przynosić REST api.
Budowanie klientów REST trwa dłużej niż klientów SOAP, ale nie są one powiązane z jedną konkretną usługą, więc powinno być możliwe ich ponowne użycie w różnych usługach. Weźmy klasyczny przykład przeglądarki internetowej. Do ilu usług może uzyskać dostęp przeglądarka internetowa? A co z czytnikiem kanałów? Teraz do ilu różnych usług może uzyskać dostęp przeciętny klient Twittera? Tak, tylko jeden.
Klientów REST nie należy budować w taki sposób, aby łączyły się z pojedynczą usługą, należy ich budować, aby obsługiwały określone typy mediów, które mogą być obsługiwane przez dowolną usługę. Oczywiste pytanie brzmi: w jaki sposób można zbudować klienta REST dla usługi, która dostarcza application / json lub application / xml. Cóż, nie możesz. Dzieje się tak, ponieważ te formaty są całkowicie bezużyteczne dla klienta REST. Sam to powiedziałeś
musisz "zgadywać" co wróci do potoku, ponieważ nie ma prawdziwego schematu ani dokumentu referencyjnego
Masz absolutną rację w przypadku usług takich jak Twitter. Jednak samoopisowe ograniczenie w REST mówi, że nagłówek typu zawartości HTTP powinien dokładnie opisywać zawartość, która jest przesyłana przez sieć. Dostarczenie application / json i application / xml nie mówi nic o zawartości.
Jeśli chodzi o wydajność systemów opartych na REST, należy spojrzeć z szerszej perspektywy. Mówienie o bajtach obwiedni jest jak mówienie o rozwijaniu pętli podczas porównywania sortowania szybkiego z sortowaniem w powłoce. Istnieją scenariusze, w których SOAP może działać lepiej, i są scenariusze, w których REST może działać lepiej. Kontekst jest wszystkim.
REST zyskuje znaczną część swojej przewagi w zakresie wydajności, będąc bardzo elastycznym w zakresie obsługiwanych typów nośników oraz dzięki zaawansowanej obsłudze buforowania. Aby buforowanie działało dobrze, należy przestrzegać prawie wszystkich ograniczeń.
Twoja ostatnia uwaga dotycząca czytelnych adresów URL jest zdecydowanie najbardziej ironiczna. Jeśli naprawdę zastosujesz się do ograniczenia hipermediów, każdy adres URL może być identyfikatorem GUID, a programista klienta nie straci nic na czytelności.
Fakt, że identyfikatory URI powinny być nieprzejrzyste dla klienta, jest jedną z najważniejszych rzeczy podczas tworzenia systemów REST. Czytelne adresy URL są wygodne dla programistów serwera, a dobrze zorganizowane adresy URL ułatwiają strukturze serwera wysyłanie żądań, ale są to szczegóły implementacji, które nie powinny mieć wpływu na programistów korzystających z interfejsu API.
Twitter API nie jest nawet bliski bycia RESTful i dlatego nie widzisz żadnych korzyści z używania go przez SOAP. Interfejs API Netflix jest znacznie bliżej, ale użycie ogólnych typów mediów pokazuje, że nieprzestrzeganie nawet jednego ograniczenia może mieć głęboki wpływ na korzyści płynące z usługi.
Może to nie wszystko ich wina
Zrobiłem dużo dumpingu na usługodawcach, ale potrzeba dwóch, aby tańczyć RESTfully. Usługa może przestrzegać wszystkich ograniczeń religijnie, a klient nadal może łatwo cofnąć wszystkie korzyści.
Jeśli klient na stałe koduje adresy URL, aby uzyskać dostęp do określonych typów zasobów, uniemożliwia to serwerowi zmianę tych adresów URL. Wszelkie konstrukcje adresów URL oparte na niejawnej wiedzy na temat struktury adresów URL przez usługę stanowią naruszenie.
Przyjmowanie założeń dotyczących tego, jaki typ reprezentacji zostanie zwrócony z łącza, może prowadzić do problemów. Przyjmowanie założeń dotyczących zawartości reprezentacji w oparciu o wiedzę, która nie jest wyraźnie określona w nagłówkach HTTP, z pewnością stworzy sprzężenie, które spowoduje ból w przyszłości.
Czy powinni użyć SOAP?
Osobiście nie sądzę. REST wykonany prawidłowo pozwala systemowi rozproszonemu ewoluować w perspektywie długoterminowej. Jeśli budujesz systemy rozproszone, które mają komponenty opracowane przez różnych ludzi i muszą działać przez wiele lat, REST jest całkiem dobrą opcją.