Wygląda na to, że REST to tylko zbiór konwencji dotyczących używania protokołu HTTP . Zastanawiam się, jaką korzyść dają te konwencje. Czy ktoś wie?
161
Wygląda na to, że REST to tylko zbiór konwencji dotyczących używania protokołu HTTP . Zastanawiam się, jaką korzyść dają te konwencje. Czy ktoś wie?
Odpowiedzi:
Nie sądzę, abyś dostał dobrą odpowiedź na to pytanie, częściowo dlatego, że nikt tak naprawdę nie zgadza się co do tego, czym jest REST . Strona wikipedii jest pełna frazesów i mało objaśnień. Warto przejrzeć stronę dyskusji, aby zobaczyć, jak bardzo ludzie się z tym nie zgadzają. O ile mogę jednak stwierdzić, REST oznacza to:
Zamiast losowo nazwane setter i getter adresy i korzystania
GET
dla wszystkich pobierające iPOST
dla wszystkich ustawiaczy, staramy się mieć adresy URL zidentyfikowanie zasobów, a następnie za pomocą działań HTTPGET
,POST
,PUT
iDELETE
robić rzeczy z nimi. Więc zamiastTy byś zrobił
A potem
POST
iPUT
odpowiadają operacjom „Utwórz” i „Aktualizuj” (ale nikt nie zgadza się, w którą stronę).Myślę, że argumenty buforowania są błędne, ponieważ ciągi zapytań są zwykle buforowane, a poza tym tak naprawdę nie musisz ich używać. Na przykład django sprawia, że coś takiego jest bardzo łatwe i nie powiedziałbym, że to REST:
Lub po prostu umieść czasownik w adresie URL:
W tym przypadku
GET
oznacza coś bez skutków ubocznych iPOST
oznacza coś, co zmienia dane na serwerze. Myślę, że jest to być może trochę jaśniejsze i łatwiejsze, zwłaszcza, że można uniknąć całegoPUT
-vs-POST
. Dodatkowo możesz dodać więcej czasowników, jeśli chcesz, więc nie jesteś sztucznie związany z tym, co oferuje HTTP. Na przykład:(Lub cokolwiek, trudno wymyślić przykłady, dopóki się nie wydarzy!)
Podsumowując, widzę tylko dwie zalety:
synchronize("/articles/1/")
lub cokolwiek. To zależy w dużej mierze od twojego kodu.Myślę jednak, że jest kilka dość dużych wad:
PUT
iPOST
są. W języku angielskim mają na myśli podobne rzeczy („Zamierzam umieścić / opublikować ogłoszenie na ścianie”).Podsumowując, powiedziałbym: jeśli naprawdę nie chcesz włożyć dodatkowego wysiłku lub jeśli twoja usługa naprawdę dobrze odwzorowuje operacje CRUD, zapisz REST dla drugiej wersji twojego API.
Właśnie natknąłem się na inny problem z REST: nie jest łatwo zrobić więcej niż jedną rzecz w jednym żądaniu lub określić, które części obiektu złożonego chcesz uzyskać. Jest to szczególnie ważne w przypadku telefonów komórkowych, gdzie czas podróży w obie strony może być znaczący, a połączenia zawodne. Na przykład załóżmy, że otrzymujesz posty na osi czasu na Facebooku. „Czysty” sposób REST byłby czymś w rodzaju
Co jest trochę śmieszne. API Facebooka to całkiem niezłe IMO, więc zobaczmy, co robią:
Nie mam pojęcia, jak zrobiłbyś coś takiego z REST, a gdybyś to zrobił, czy nadal by się to liczyło jako REST. Z pewnością zignorowałbym każdego, kto próbuje ci powiedzieć, że nie powinieneś tego robić (zwłaszcza jeśli powodem jest „ponieważ to nie jest REST”)!
źródło
/user/{id}
, to nie jest to spokojne. strona?Mówiąc najprościej, REST oznacza używanie HTTP tak, jak powinno.
Zapoznaj się z rozprawą Roya Fieldinga o REST . Myślę, że każda osoba zajmująca się tworzeniem stron internetowych powinna ją przeczytać.
Uwaga: Roy Fielding jest również jednym z kluczowych sterowników protokołu HTTP.
Aby wymienić niektóre z zalet:
źródło
Mówiąc najprościej: BRAK .
Zapraszam do głosowania przeciw, ale nadal uważam, że nie ma żadnych prawdziwych korzyści w porównaniu z protokołem HTTP innym niż REST. Wszystkie aktualne odpowiedzi są nieprawidłowe. Argumenty z aktualnie najczęściej głosowanej odpowiedzi:
1. Proste
Dzięki REST potrzebujesz dodatkowej warstwy komunikacyjnej dla skryptów po stronie serwera i klienta => jest to w rzeczywistości bardziej skomplikowane niż użycie protokołu HTTP innego niż REST.
2. Buforowanie
Buforowaniem można sterować za pomocą nagłówków HTTP wysyłanych przez serwer. REST nie dodaje żadnych funkcji, których brakuje w trybie innym niż REST.
3. Organizacja
REST nie pomaga w organizowaniu rzeczy. To zmusza do korzystania z API obsługiwanego przez biblioteki po stronie serwera, którego używasz. Możesz zorganizować swoją aplikację w ten sam sposób (lub lepiej), gdy używasz podejścia innego niż REST. Np. Patrz Model-View-Controller lub routing MVC .
4. Łatwy w użyciu / implementacji
Wcale nieprawda. Wszystko zależy od tego, jak dobrze zorganizujesz i udokumentujesz swoją aplikację. REST nie poprawi w magiczny sposób Twojej aplikacji.
źródło
IMHO Największą zaletą REST jest redukcja sprzężenia klient / serwer. Z czasem znacznie łatwiej jest rozwijać interfejs REST bez uszkadzania istniejących klientów.
źródło
Wykrywalność
Każdy zasób ma odniesienia do innych zasobów, w hierarchii lub w linkach, więc można je łatwo przeglądać. Jest to korzyść dla człowieka, który rozwija klienta, oszczędzając mu ciągłego konsultowania się z lekarzami i oferowania sugestii. Oznacza to również, że serwer może jednostronnie zmieniać nazwy zasobów (o ile oprogramowanie klienta nie koduje adresów URL na stałe).
Zgodność z innymi narzędziami
Możesz przejść do dowolnej części interfejsu API lub użyć przeglądarki internetowej do nawigacji po zasobach. Znacznie ułatwia debugowanie i integrację testową.
Znormalizowane nazwy czasowników
Pozwala określić działania bez konieczności szukania właściwego sformułowania. Wyobraź sobie, że metody pobierające i ustawiające OOP nie byłyby ustandaryzowane, a niektórzy używaliby zamiast tego
retrieve
idefine
. Musiałbyś zapamiętać poprawny czasownik dla każdego indywidualnego punktu dostępu. Świadomość, że istnieje tylko kilka dostępnych czasowników, przeciwdziała temu problemowi.Stan standaryzowany
Jeśli jesteś
GET
zasobem, który nie istnieje, możesz być pewien, że wystąpi404
błąd w RESTful API. Porównaj to z interfejsem API innym niż RESTful, który może powrócić{error: "Not found"}
zawinięty w Bóg wie, ile warstw. Jeśli potrzebujesz dodatkowego miejsca na napisanie wiadomości do programisty po drugiej stronie, zawsze możesz użyć treści odpowiedzi.Przykład
Wyobraź sobie dwa interfejsy API o tej samej funkcjonalności, jeden po REST, a drugi nie. Teraz wyobraź sobie następujących klientów dla tych interfejsów API:
Spokojny:
HTTP:
Teraz pomyśl o następujących pytaniach:
Jeśli pierwszy telefon od każdego klienta zadziałał, czy możesz być pewien, że reszta też zadziała?
Nastąpiła poważna aktualizacja interfejsu API, która mogła zmienić te punkty dostępu lub nie. Ile dokumentów będziesz musiał ponownie przeczytać?
Czy potrafisz przewidzieć powrót ostatniego zapytania?
Musisz edytować opublikowaną recenzję (przed jej usunięciem). Czy możesz to zrobić bez sprawdzania dokumentów?
źródło
Polecam zajrzeć do książki Ryana Tomayko How I Explained REST to My Wife
Edycja strony trzeciej
Fragment z linku waybackmaschine:
Co powiesz na przykład. Jesteś nauczycielem i chcesz zarządzać uczniami:
Jeżeli układy są oparte na sieci Web, a następnie tam chyba URL dla każdego z rzeczowników zaangażowanych tutaj:
student, teacher, class, book, room, etc
. ... Gdyby dla każdego adresu URL istniała czytelna dla komputera reprezentacja, byłoby rzeczą trywialną umieszczać nowe narzędzia w systemie, ponieważ wszystkie te informacje byłyby użyteczne w standardowy sposób. ... można zbudować ogólnokrajowy system, który będzie w stanie rozmawiać z każdym z indywidualnych systemów szkolnych w celu zbierania wyników testów.Każdy z systemów otrzymywałby informacje od siebie za pomocą prostego HTTP GET. Jeśli jeden system musi dodać coś do innego systemu, użyje HTTP POST. Jeśli system chce coś zaktualizować w innym systemie, używa HTTP PUT. Pozostało tylko dowiedzieć się, jak powinny wyglądać dane.
źródło
Wszystkim, którzy szukają odpowiedzi na to pytanie, radzę przejrzeć ten „pokaz slajdów” .
Nie mogłem zrozumieć, czym jest REST i dlaczego jest taki fajny, jego zalety i wady, różnice w stosunku do SOAP - ale ten pokaz slajdów był tak genialny i łatwy do zrozumienia, więc teraz jest dla mnie znacznie bardziej jasny niż wcześniej.
źródło
Buforowanie.
Istnieją inne, bardziej dogłębne zalety REST, które obracają się wokół możliwości ewolucji poprzez luźne powiązanie i hipertekst, ale mechanizmy buforowania są głównym powodem, dla którego powinieneś dbać o RESTful HTTP.
źródło
GET /get_article/19/
iPOST /update_article
jeśli buforowanie jest Twoim problemem. Nadal można zrobić wszystko z tylkoGET
aPOST
i wierzę, żeREST
środki „UżyjGET
,POST
,PUT
iDELETE
tylko”. a nie tylko „Nie używaj ciągów zapytań”. więc to, co sugerowałem, nie byłobyREST
. Z drugiej strony, nikt nie może naprawdę zgodzić się, coREST
jest, więc umieszczam to w wiadrze z „Web 2.0”.Jest to zapisane w rozprawie Fieldinga . Ale jeśli nie chcesz dużo czytać:
źródło
Czy można zrobić wszystko tylko za pomocą POST i GET? Tak, czy to najlepsze podejście? Nie dlaczego? ponieważ mamy standardowe metody. Jeśli pomyślisz jeszcze raz, wszystko byłoby możliwe, używając tylko GET ... więc po co w ogóle zawracać sobie głowę korzystaniem z POST? Ze względu na standardy!
Na przykład, myśląc dzisiaj o modelu MVC, możesz ograniczyć swoją aplikację do odpowiadania tylko na określone rodzaje czasowników, takie jak POST, GET, PUT i DELETE. Nawet jeśli pod maską wszystko jest emulowane do POST i GET, czy nie ma sensu używać różnych czasowników dla różnych czynności?
źródło
Odkrywanie jest znacznie łatwiejsze w REST. Mamy dokumenty WADL (podobne do WSDL w tradycyjnych usługach sieciowych), które pomogą Ci zareklamować Twoje usługi na świecie. Możesz także użyć odkryć UDDI. W przypadku tradycyjnych protokołów HTTP POST i GET użytkownicy mogą nie znać schematów żądań wiadomości i odpowiedzi, aby do Ciebie zadzwonić.
źródło
Jedną z zalet jest to, że możemy przetwarzać dokumenty XML w sposób niesekwencyjny i nierzeczywiste dane XML z różnych źródeł, takich jak obiekt InputStream, adres URL, węzeł DOM ...
źródło
@Timmmm, o twojej edycji:
To znacznie zmniejszyłoby liczbę połączeń
I nic nie stoi na przeszkodzie, aby zaprojektować serwer, który akceptuje parametry HTTP do oznaczania wartości pól, których mogą potrzebować Twoi klienci ...
Ale to jest szczegół.
Znacznie ważniejszy jest fakt, że nie wspomniałeś o ogromnych zaletach stylu architektonicznego REST (dużo lepsza skalowalność dzięki bezpaństwowości serwera; dużo lepsza dostępność także ze względu na bezpaństwowość serwera; dużo lepsze wykorzystanie standardowych usług, takich jak buforowanie przykład, podczas korzystania ze stylu architektonicznego REST; znacznie niższe sprzężenie między klientem a serwerem dzięki zastosowaniu jednolitego interfejsu itp.)
Co do twojej uwagi
: RDBMS również używa podejścia CRUD (SELECT / INSERT / DELETE / UPDATE) i zawsze istnieje sposób na przedstawienie modelu danych i działanie na jego podstawie.
Co do twojego wyroku
: projekt RESTful jest w zasadzie prostym projektem - ale NIE oznacza to, że jego projektowanie jest proste. Czy widzisz różnicę ? Będziesz musiał dużo pomyśleć o koncepcjach, które Twoja aplikacja będzie reprezentować i którą będzie obsługiwać, co musi zostać przez nią zrobione, jeśli wolisz, aby przedstawić to za pomocą zasobów. Ale jeśli to zrobisz, otrzymasz prostszy i wydajniejszy projekt.
źródło
Wyszukiwarki mogą ignorować ciągi zapytań.
źródło