REST vs RESTful vs „normalna” usługa internetowa - to samo, czy nie?

21

Przeczytałem kilka definicji i dyskusji na temat REST i / lub RESTful aplikacji, ale nadal nie rozumiem prawdziwego znaczenia tego.

Zwykle pracuję z aplikacjami, które albo pobierają dane przez GET, albo wysyłają dane przez POST do jakiegoś serwisu internetowego (zwykle skryptu PHP), który następnie albo pobiera dane z bazy danych, albo zapisuje dane w bazie danych.

Czy to jest aplikacja RESTful? Jeśli nie, jaka byłaby aplikacja RESTful? Jaka jest różnica między koncepcją RESTful a koncepcją, z którą do tej pory pracowałem? Proszę wyjaśnić na przykładzie.

Ponadto ktoś mówi o REST, a ktoś o RESTful aplikacjach. Odkryłem, że termin REST odnosi się do koncepcji teoretycznej, natomiast RESTful jest używany, gdy mówimy o konkretnej aplikacji. Czy to prawda, czy istnieją prawdziwe różnice między aplikacjami REST i RESTful?

deviDave
źródło
1
Jeśli możesz zbudować wszystkie serwlety, aby pobierać informacje TYLKO z parametrów GET lub POST (absolutnie nic nie jest zapisywane lokalnie przed wywołaniem), oznacza to, że poprawnie stosujesz REST. Innymi słowy, serwer odgrywa rolę modelu w MVC, ponieważ nie ma nad nim kontroli, ale po prostu używa tego, co zostało podane, aby wykonać pewne zadanie. Mam nadzieję, że to wyjaśnia to trochę lepiej.
Neil,
@Neil Jestem po drugiej stronie - aplikacja mobilna. Jest to klient, który korzysta z usługi internetowej i komunikuje się z nią za pomocą POST i GET. Wszystkie usługi internetowe zostały zbudowane przez kogoś innego, a ja tylko z nich korzystałem. Ale terminologia mnie pomieszała. Jeśli więc korzystam z kanału HTTP i obiektów HttpGet / HttpPost, mam do czynienia z aplikacją RESTful, prawda?
deviDave
Niekoniecznie. Nie ma sposobu, aby dowiedzieć się, czy jest to aplikacja RESTful, jeśli nie wiesz, jak działa serwer, ponieważ może to naruszać pewne ograniczenia. To powiedziawszy, prawdopodobnie RESTful jeśli zwraca spójne wyniki.
Neil,
@Neil Oh, rozumiem teraz. RESTful odbywa się na serwerze. A jeśli wyślę obiekt postu z żądaniem (nie każdy parametr osobno), to prawdopodobnie jest to podejście REST. Jeśli chodzi o klienta (aplikacja mobilna), nie ma znaczenia, czy jest to REST, czy nie, ponieważ kodowanie jest takie samo. Czy mam rację?
deviDave
2
RESTful jest zarówno serwerem, jak i klientem, ale jeśli widzisz tylko klienta, możesz wiedzieć tylko, czy klient spełnia ograniczenia. To wszystko, co miałem na myśli. Rozumiem przez REST, że jeśli musisz się zalogować, podajesz nazwę użytkownika i hasło. Serwer sprawdza login i zapisuje klucz skrótu użytkownika w bazie danych i zwraca go. Teraz, gdy trzeba wykonać operację wymagającą zalogowania, zawsze przekazuje się klucz skrótu użytkownika. Serwer „zapomina”, że Cię zalogował, ale używa skrótu użytkownika do sprawdzenia poprawności stanu logowania. Gdyby to nie było RESTful, serwer pamiętałby, że jesteś zalogowany. Rozumiesz różnicę?
Neil,

Odpowiedzi:

13

Kluczowymi atrybutami aplikacji RESTful są: Cała komunikacja odbywa się za pośrednictwem protokołu HTTP GET, POST, PUT, DELETE I wszystkie elementy są adresowane za pomocą standardowego adresu URL formularza, http://your.site.com/salesapp/salesperson/0000001/detailstj. Tylko czysty adres URL bez parametrów itp. URL identyfikuje element GET , POST, PUT, DELETE określa, co chcesz z tym zrobić.

Głównym powodem tego jest to, że automatycznie masz usługę bezstanową, która może być równoważona obciążeniem, przełączaniem awaryjnym itp. Itp.

Sama prostota schematu sprawia, że ​​interfejs jest bardzo czysty, całkowicie oddzielając klienta od konkretnej implementacji zaplecza.

James Anderson
źródło
Och, do tej pory nie używałem PUT ani DELETE (aplikacje mobilne zwykle robią tylko GET i POST), ale tak naprawdę wygląda to, co zrobiłem i robię w tej chwili. Po prostu klienci nie używali terminów REST *, a raczej „serwis internetowy” i „skrypt php”
deviDave
2
James, czy możesz wyjaśnić, dlaczego należy unikać parametrów zapytań? Na przykład, jak mam wyrazić, że chcę filtrować zasoby w określony sposób bez wprowadzania fałszywej hierarchii?
Gary Rowe
3
@GaryRowe: URL (bez parametrów) identyfikuje zasób, którym chcesz manipulować. Nadal możesz mieć parametry, ale nie są one używane do identyfikacji zasobu. Przykład GET w katalogu (adres URL kończący się na /) powinien zwrócić listę zasobów w katalogu. Za pomocą parametru w adresie URL można określić filtr lub kolejność sortowania lub coś w tym rodzaju.
Martin York
1
Dzięki, Loki. James może zechcieć edytować swoją odpowiedź, aby to odzwierciedlić, ponieważ wydaje się, że nie zezwala na stosowanie parametrów zapytania w żadnych okolicznościach, które mogą wprowadzać w błąd. W rzeczywistości istnieje interesująca obserwacja, że ​​lista zasobów w katalogu sama w sobie jest zasobem wyrażającym tę koncepcję.
Gary Rowe,
REST nie wymaga, aby aplikacja była oparta na adresach URL, ani nie wymaga czasowników takich jak GET, POST, DELETE itp. Jednak w przypadku aplikacji internetowej URL jest jedyną opcją i wspomnianymi czasownikami.
Nawaz
6

REST to skrót od Representative State Transfer. Jeśli oprogramowanie jest zgodne z ograniczeniami REST, wówczas uznaje się je za RESTful.

Tak, teraz, kiedy bezwstydnie zgrałem z Wikipedii, co to tak naprawdę oznacza? Skutecznie oznacza to użycie wbudowanych poleceń HTTP, takich jak GET, POST, PUT, DELETE i kilka innych rzadszych, do komunikacji między klientem a serwerem.

To, co robisz, brzmi jak aplikacja RESTFul. Istnieje jednak duża różnica między dobrze zaprojektowanymi i stosami śmieciowych usług internetowych RESTFul. Na przykład kod PHP na drugim końcu GET może wykonać zmianę stanu, co byłoby uważane za nieprawidłowe, ponieważ GET jest postrzegany jako operacja tylko do odczytu. Istnieją również subtelne różnice między sposobem użycia POST (nowy) i PUT (zamień).

Artykuł w Wikipedii na ten temat jest naprawdę bardzo dobry, więc zatrzymam się tutaj.

Martijn Verburg
źródło
Do tej pory używałem GET (HttpGet) do pobierania zawartości i POST (HttpPost) do wprowadzania / zmiany zawartości bazy danych. Wysłałem to jako parametr do HttpPost i skrypt PHP na serwerze WWW przekonwertował te parametry na kod SQL. Czy to aplikacja RESTful? Interesuje mnie koncepcja, a nie to, jak dobrze skrypt PHP został wykonany. Nie udało mi się.
deviDave
2
Zbadałbym użycie PUT w przypadku, gdy zamieniasz zawartość, jest to bardziej idiomatyczny REST niż zawsze przy użyciu POST.
Martijn Verburg
Tak, w takim przypadku użyłbym PUT.
deviDave
+1 za zauważenie, że GET musi być poprawnie zaimplementowany (tzn. Jest idempotentny). Taki podstawowy błąd na początku.
Gary Rowe,
@deviDave Możesz także zajrzeć do PATCH, która została zaprojektowana do aktualizacji części zasobu. Jak słusznie zauważa Martin, PUT służy do zastąpienia całego zasobu.
Gary Rowe
4

Zanim przejdziemy dalej, to powiązane pytanie może ci pomóc

Różnica między REST i RESTful to po prostu semantyka. REST to styl architektoniczny stosowany do relacji klient-serwer. RESTful to po prostu sposób na poinformowanie klientów, że korzystasz z REST.

Wiele aplikacji internetowych twierdzi, że jest RESTful, ale w rzeczywistości są one tylko częściowo zgodne z ograniczeniami REST (jak Martijn Verburg również wspomniał w swojej odpowiedzi). Wymienię je tutaj, ale gorąco zachęcam do przeczytania artykułu:

  • Klient – ​​serwer
  • Pamięć podręczna
  • System warstwowy
  • Kod na żądanie (opcjonalnie)

Ponieważ wspominasz, że pracujesz po stronie klienta, pomocne może być sprawdzenie, co daje architektura REST i czego można oczekiwać od ciebie jako klienta łączącego się. Mimo że REST nie jest HTTP, jest to zdecydowanie najpopularniejszy protokół, który obsługuje REST, dlatego opowiem o nim mój przykład.

Twój klient będzie musiał:

  • używaj czasowników HTTP (np. GET, POST, PUT, DELETE, OPTIONS, PATCH) do wykonywania odpowiednich operacji
  • oferuj Akceptuj nagłówki i rozumiem nagłówki Content-Type (np. otrzymujesz XML, którego nigdy wcześniej nie widziałeś, ale możesz użyć referencyjnego XSD, aby utworzyć model domeny po stronie klienta, aby przedstawić go użytkownikowi)
  • podążaj za oferowanymi linkami w zrozumiałym dla siebie typie treści (np. poproś użytkownika lub aplikację, aby wnioskowały, że <link rel="pay" href="http://example.org/orders(1)/payment">w HTML wyraża przejście stanu w celu utworzenia zasobu płatniczego za pomocą POST z treścią zawierającą XML, który reprezentuje szczegóły płatności, takie jak numer karty kredytowej , kwota i tak dalej)
  • reagować poprawnie na szeroki zakres kodów stanu HTTP

Jeśli spełnia powyższe warunki, można uznać, że jest to klient REST, możesz nazwać go „aplikacją RESTful”, ale to raczej sugeruje, że używasz REST po stronie klienta, co jest niepoprawne, dlatego najlepiej go unikać termin.

Gary Rowe
źródło
3

RESTful oznacza, że ​​interfejs jest zestawem obiektów, które można czytać i aktualizować (i ewentualnie usuwać). Oznacza to, że nie ma zapytań wieloparametrowych (tylko parametr jest obiektem, który chcesz przeczytać) i istnieje tylko jeden rodzaj operacji, który zmienia cokolwiek na serwerze, przesyłanie nowego stanu.

Ograniczenia te zapewniają, że wszystkie żądania są idempotentne (wielokrotne wysyłanie ich nie ma żadnego dodatkowego wpływu na wysyłanie ich raz). Jest to ważne, ponieważ sieć może ulec awarii w dowolnym momencie i nie dostarczyć żadnego żądania ani odpowiedzi, a przy idempotentnych żądaniach wystarczy wysłać ją ponownie i nie trzeba wykonywać skomplikowanego odzyskiwania.

Jan Hudec
źródło
Głosowanie za pierwszym akapitem. Taki zwięzły. Dzięki!
deviDave
Jeszcze jedna rzecz, aby sprawdzić, czy dobrze to zrozumiałem. Jeśli ja (moja aplikacja) jest klientem usługi REST, ja jako klient nie zastanawiam się, czy usługa jest RESTful czy nie, ponieważ moje kodowanie jest zawsze takie samo (httpget, httppost itp.)? Ta zasada ma znaczenie tylko dla właściciela skryptu / aplikacji serwera?
deviDave
REST jest wskazówką do projektowania semantyki interfejsu. Podstawową technologią jest HTTP, niezależnie od tego, czy interfejs jest RESTful czy nie (ale inne warstwy, takie jak XML-RPC lub SOAP, nie są odpowiednie dla interfejsów RESTful), więc zawsze używasz tego samego httpget, httppost itp. Ale awarie sieci traktujesz inaczej.
Jan Hudec
aby dodać, SMTP jest interfejsem RESTful, chociaż używa innych czasowników z GET, PUT itp. i innego bazowego protokołu, koncepcja jest taka sama - wysyłasz polecenia oparte na czasownikach idempotentnych na serwer.
gbjbaanb
Nie wszystkie żądania REST są idempotentne. Na przykład wielokrotne wydanie POST spowoduje powstanie wielu nowych zasobów.
Gary Rowe,