Różnica między REST a CRUD

168

Nauczyłem się REST i bardzo przypomina CRUD (z tego, co przeczytałem o CRUD).

Wiem, że są różne i zastanawiam się, czy myślenie, że są podobne, oznacza, że ​​ich nie rozumiem.

Czy REST jest „nadzbiorem” CRUD? Czy wszystko, co robi CRUD i więcej?

Jesse Black
źródło
17
Myśląc, że są podobne środki, które mają je zrozumieć. Czytając odpowiedzi, widzę zaskakujące i co uważam za błędne poziom nie uznając podobieństw między pojęciami. Uważam, że poprawnym sposobem zrozumienia REST jest myślenie o nim jako „CRUD dla zasobów HTTP”. Jeśli rozumiesz, czym jest zasób HTTP (oczywiście nie jest tym samym rekordem bazy danych) i wiesz, co to jest CRUD, to opisanie REST jako „CRUD dla zasobów HTTP” jest poprawnym i zwięzłym sposobem przekazania istoty REST.
Jason Livesay

Odpowiedzi:

205

Co zaskakujące, w innych odpowiedziach nie widzę, co uważam za prawdziwą różnicę między REST a CRUD: czym zarządza każdy.

CRUD oznacza podstawowe operacje do wykonania w repozytorium danych. Bezpośrednio obsługuje się rekordy lub obiekty danych; oprócz tych operacji rekordy są jednostkami pasywnymi. Zazwyczaj są to tylko tabele i rekordy bazy danych.

Z drugiej strony REST działa na reprezentacjach zasobów, z których każda jest identyfikowana przez adres URL. Zazwyczaj nie są to obiekty danych, ale złożone abstrakcje obiektów.

Na przykład zasób może być komentarzem użytkownika. Oznacza to nie tylko zapis w tabeli „komentarza”, ale także jego relacje z zasobem „użytkownika”, post, do którego komentarz jest dołączony, może inny komentarz, na który odpowiada.

Operowanie komentarzem nie jest prymitywną operacją bazy danych, może mieć znaczące skutki uboczne, takie jak ostrzeżenie oryginalnego plakatu lub ponowne obliczenie niektórych „punktów” podobnych do gry lub aktualizacja „strumienia obserwujących”.

Reprezentacja zasobów zawiera także hipertekst (sprawdź zasadę HATEOAS ), umożliwiając projektantowi wyrażenie relacji między zasobami lub prowadzenie klienta REST w przepływie pracy operacji.

W skrócie, CRUD to zestaw prymitywnych operacji (głównie dla baz danych i statycznych magazynów danych), podczas gdy REST jest bardzo wysokim poziomem API (głównie dla usług internetowych i innych systemów „na żywo”).

Pierwszy manipuluje podstawowymi danymi, drugi współdziała ze złożonym systemem.

Javier
źródło
3
@Javier Dzięki za ich wyróżnienie. Użyłem REST do nauki Railsów i odniosłem wrażenie, że był to zamiennik CRUD (o którym dowiedziałem się odkąd ... nazwa, którą już używałem, po prostu nie wiedziałem, jak to nazwać) ... zmieniono REST vs CRUD z porównywania 2 jabłek na porównywanie jabłek i pomarańczy. Dzięki
Jesse Black
2
@Maudicus: myślę, że jest to bardzo powszechne, ponieważ RoR zawiera warstwę CRUD (jak większość (każdy?) Framework) i ułatwia (automatyczne?) Dodanie API REST na dodatek, łatwo jest myśleć, że to wszystko czym jest REST. Ale potem możesz dodać funkcjonalność na CRUD, ale za interfejsem API REST, czyniąc je coraz bardziej różnymi.
Javier,
1
Twoja odpowiedź jest poprawna, ale przykład nie jest optymalny: komentarz może sprowadzać się do pojedynczego wiersza db i czy nie jest możliwe wdrożenie dynamicznych zmian w obiektach pokrewnych za pomocą wyzwalaczy db? Wydaje mi się, że w spokojnym API jest coś więcej niż zwykłe operacje, a twoja odpowiedź wyraźnie niesie to uczucie.
didierc
2
Więc ... ta sama rzecz, inna warstwa :)
AlikElzin-kilaka
Dziękuję bardzo za wyrażenie tego! Dodałbym, że ograniczenie czasowników HTTP do operacji CRUD skutkuje implementacją REST dosłownie jako CRUD, z wieloma narzędziami, które uogólniają płytę kotłową CRUD i brakuje miejsca dla tej niestandardowej logiki „operowania na komentarz”.
sompylasar
99

Po pierwsze, oba są po prostu zwykłymi inicjałami; nie ma się czego bać.

Teraz CRUD to prosty termin, który został skrócony, ponieważ jest wspólną cechą wielu aplikacji i łatwiej jest powiedzieć CRUD . Opisuje 4 podstawowe operacje, które można wykonać na danych (lub zasobie). Twórz, czytaj, aktualizuj, usuwaj.

REST jest jednak nazwaną praktyką (podobnie jak AJAX), a nie technologią samą w sobie. Zachęca do korzystania z funkcji, które od dawna są związane z protokołem HTTP, ale rzadko są używane.

Gdy masz adres URL (Uniform Resource Locator ) i kierujesz na niego swoją przeglądarkę wierszem adresu, wysyłasz żądanie HTTP . Każde żądanie HTTP zawiera informacje, których serwer może użyć, aby dowiedzieć się, która odpowiedź HTTP odsyła do klienta, który wysłał żądanie.

Każde żądanie zawiera adres URL, dzięki czemu serwer wie, do którego zasobu chcesz uzyskać dostęp, ale może również zawierać metodę . Metoda opisuje, co zrobić z tym zasobem.

Ale ta koncepcja „metody” nie była używana zbyt często.

Zwykle ludzie po prostu prowadzą do stron za pomocą metody GET i wydają wszelkiego rodzaju aktualizacje (usuwanie, wstawianie, aktualizacje) za pomocą metody POST.

Z tego powodu nie można traktować jednego zasobu (URL) jako prawdziwego zasobu samego w sobie. Trzeba było mieć oddzielne adresy URL do usuwania, wstawiania lub aktualizacji tego samego zasobu. Na przykład:

http://...com/posts/create- POST request  -> Goes to posts.create() method in the server
http://...com/posts/1/show- GET request  -> Goes to posts.show(1) method in the server
http://...com/posts/1/delete - POST request  -> Goes to posts.delete(1) method in the server
http://...com/posts/1/edit- POST request  -> Goes to posts.edit(1) method in the server

Dzięki REST tworzysz formularze, które są mądrzejsze, ponieważ używają innych metod HTTP oprócz POST, i programujesz swój serwer tak, aby mógł rozróżniać metody , nie tylko adresy URL. Na przykład:

http://...com/posts - POST request  -> Goes to posts.create() method in the server
http://...com/posts/1 - GET request  -> Goes to posts.show(1) method in the server
http://...com/posts/1 - DELETE request  -> Goes to posts.delete(1) method in the server
http://...com/posts/1 - PUT request  -> Goes to posts.edit(1) method in the server

Pamiętaj, że pojedynczy adres URL opisuje pojedynczy zasób. Pojedynczy post jest pojedynczym zasobem. Dzięki REST traktujesz zasoby tak, jak powinny być traktowane. Mówisz serwerowi, który zasób chcesz obsłużyć i jak go obsłużyć.

Istnieje wiele innych funkcji „RESTful architecture”, o których możesz przeczytać w Wikipedii, innych artykułach lub książkach, jeśli jesteś zainteresowany. Z drugiej strony sama CRUD nie ma wiele więcej.

Yam Marcovic
źródło
4
przepraszam, ale REST to znacznie więcej niż CRUD. głównie dlatego, że zasoby zawierają więcej niż jeden rekord, a każda operacja ma znacznie więcej niż aktualizację.
Javier
11
Dobrze. Zgadzam się. Dlaczego jest ci przykro? Nie powiedziałem, że to niewiele więcej niż CRUD. Myślę, że to jest dokładnie to, co miał powiedzieć.
Yam Marcovic,
4
To powinna być właściwa odpowiedź.
Brandon
Specyfikacja HTML zezwala tylko na metody GET i POST do przesyłania formularzy, więc inne metody nie były używane w usługach obsługujących żądania od klientów internetowych, zanim AJAX stał się powszechny. Niektóre usługi używają ukrytego pola wejściowego o nazwie „_method” jako obejścia, aby określić metodę inną niż POST, jednocześnie przesyłając formularz przy użyciu metody POST.
Kenneth Sundqvist
20

REST oznacza „reprezentacyjny transfer stanu”, co oznacza, że ​​chodzi o komunikację i modyfikację stanu niektórych zasobów w systemie.

REST bardzo się angażuje, ponieważ teoria REST wprowadza media, hipermedia i podstawowy protokół do zarządzania informacjami w systemie zdalnym.

Z drugiej strony CRUD jest mnemonikiem typowych operacji potrzebnych dla danych w bazie danych: Utwórz Pobierz Aktualizuj Usuń. Ale tak naprawdę to nie jest głębsze.

To jest odpowiedź na twoje pytanie, ale wspomnę o powszechnym błędzie, jaki widzę, gdy REST i CRUD są omawiane razem. Wielu programistów chce bezpośrednio mapować REST na CRUD, ponieważ REST przez HTTP zapewnia GET PUT POST i DELETE, podczas gdy CRUD zapewnia CREATE RETRIEVE UPDATE DELETE. Naturalne jest, że chcesz mapować czasowniki REST bezpośrednio na operacje CRUD.

Jednak HTTP używa stylu „utwórz lub zaktualizuj”, podczas gdy CRUD rozdziela tworzenie i aktualizację. To uniemożliwia (!) Stworzenie czystego, ogólnego mapowania między nimi (!)

GET i DELETE są łatwe ... GET === RETRIEVE, a DELETE === DELETE.

Ale zgodnie ze specyfikacją HTTP PUT to tak naprawdę Utwórz ORAZ Zaktualizuj:

  • Użyj PUT, aby utworzyć zupełnie nowy obiekt, gdy wiesz o nim wszystko, w tym jego identyfikator

  • Użyj PUT, aby zaktualizować obiekt (zwykle z pełną reprezentacją obiektu)

POST jest czasownikiem „przetwarzającym” i jest uważany za czasownik „dołączający”:

  • Użyj POST, aby dołączyć nowy obiekt do kolekcji - czyli utwórz nowy obiekt

  • POST jest również używany, gdy żaden z pozostałych czasowników nie jest w pełni dopasowany, ponieważ specyfikacja HTTP definiuje go jako czasownik „przetwarzania danych”

  • Jeśli Twój zespół rozłącza się na POST, pamiętaj, że cała WWW została zbudowana na GET i POST;)

Tak więc chociaż istnieje podobieństwo między REST i CRUD, błędem, który widzę, że większość zespołów popełnia, jest wyrównanie między nimi. Zespół naprawdę musi zachować ostrożność podczas definiowania interfejsu API REST, aby nie rozwiewać się zbytnio na mnemonice CRUD, ponieważ REST jako praktyka ma naprawdę wiele dodatkowych złożoności, które nie mapują się czysto na CRUD.

Obrabować
źródło
7

CRUD określa minimalny zestaw podstawowych czasowników pamięci do odczytu i zapisu danych: tworzenie, czytanie, aktualizacja i usuwanie. Następnie możesz budować inne operacje, agregując je. Są to zwykle operacje bazy danych, ale to, co uważa się za bazę danych, jest arbitralne (np. Może to być relacyjny DBMS, ale może to być również pliki YAML).

REST jest „stylem architektonicznym”, który zwykle obejmuje operacje CRUD i inne operacje wyższego poziomu, wszystkie do wykonania na pewnej koncepcji „zasobów” (dowolne, ale są to byty w twojej aplikacji). REST ma wiele ograniczeń, które sprawiają, że jest interesujący (a szczególnie dobrze sparowany z HTTP).

Interfejs REST może, ale nie musi, ujawniać wszystkie operacje CRUD dla określonego zasobu. To, co jest dostępne w interfejsie REST, jest arbitralne i może ulec zmianie ze względu na uprawnienia systemowe, uwagi dotyczące interfejsu użytkownika oraz to, jak gorąco było w dniu zaprojektowania i utworzenia interfejsu. Zwykle cieplejsze dni prowadzą do bardziej minimalistycznych interfejsów, choć może być odwrotnie.

Dan Rosenstark
źródło
Dzięki Yar. Wygląda na to, że „Czy wszystko, co robi CRUD i więcej?” jest tak, przy czym technika REST dotyczy więcej niż tylko wpisów w bazie danych.
Jesse Black,
@Maudicus Zaktualizowałem odpowiedź, ale konkretnie: może, ale nie musi.
Dan Rosenstark,
Nie powiedziałbym, że są one wymagane, aby Twoje podanie zostało uznane za kompletne. Niektóre aplikacje z natury nie wymagają wstawiania, usuwania ani aktualizacji.
Yam Marcovic,
@Yam Marcovic, w porządku, poprawione
Dan Rosenstark,
6

CRUD

  • CRUD to cztery podstawowe typy poleceń SQL: Utwórz, Odczytaj, Aktualizuj i Usuń
  • Większość aplikacji ma jakąś funkcjonalność CRUD
  • Aplikacja CRUD to taka, która używa formularzy do pobierania danych z bazy danych i do niej

ODPOCZYNEK

  • REST to skrót od Representative State Transfer (czasami jest napisane „ReST”)

  • Opiera się na bezstanowym protokole komunikacyjnym klient-serwer, który może być buforowany - i praktycznie we wszystkich przypadkach używany jest protokół HTTP

  • REST to styl architektury do projektowania aplikacji sieciowych

Vayodya Tamari
źródło
2

REST jest czymś w rodzaju strony internetowej dla maszyn, którą mogą przeglądać, podczas gdy CRUD jest czymś w rodzaju SOAP, który jest silnie powiązany z klientami. To są główne różnice. Ofc. na powierzchni są podobne, ale CRUD opisuje podstawową manipulację bytem, ​​natomiast REST może opisywać interfejs dowolnej aplikacji. Kolejna różnica polegająca na tym, że REST może wykorzystywać więcej 4 metod HTTP. Byłaby to bardzo długa odpowiedź, jeśli chciałbym zebrać wszystkie różnice, jeśli sprawdzisz pytania dotyczące REST vs SOAP, znajdziesz większość z nich.

Myślę, że mylenie REST z CRUD jest bardzo częstym błędem, a przyczyną jest to, że programiści nie mają czasu na szczegółowe czytanie o REST. Chcą tylko korzystać z technologii - bez jej zrozumienia - w oparciu o ograniczone przykłady stylu CRUD napisane przez podobnych programistów. Zdecydowana większość przykładów i samouczków odzwierciedla poważny brak wiedzy. Mapowanie zasobów REST do encji i metod HTTP do operacji CRUD tych encji i używanie REST bez hiperłączy jest tylko tego objawem. Przez REST mapujesz hiperłącza (w tym linki metodami POST / PUT / DELETE / PATCH) do swoich operacji i identyfikujesz operację po stronie klienta, sprawdzając relację linków (zwykle API). Jeśli klient REST nie wie, czym jest relacja łącza, i zna tylko metody HTTP i być może niektóre szablony URI, to nie jest klient REST, ale CRUD na kliencie HTTP. Innym częstym błędem polegającym na tym, że klient REST jest jednostronicową aplikacją javascript działającą w przeglądarce. Oczywiście możesz wdrożyć takiego klienta, ale REST był przeznaczony głównie dla klientów automatycznych (aplikacje po stronie serwera napisane przez programistów, których nawet nie znasz), a nie dla klientów ręcznych (napisane przez ciebie aplikacje przeglądarki). Posiadanie tylko jednego klienta przeglądarki może być oznaką, że tak naprawdę nie potrzebujesz REST, a po prostu przeprojektowałeś projekt. W takich przypadkach interfejs API CRUD jest realnym rozwiązaniem, a programiści nazywają te interfejsy CRUD API jako REST, ponieważ nie znają różnicy. Oczywiście możesz wdrożyć takiego klienta, ale REST był przeznaczony głównie dla klientów automatycznych (aplikacje po stronie serwera napisane przez programistów, których nawet nie znasz), a nie dla klientów ręcznych (napisane przez ciebie aplikacje przeglądarki). Posiadanie tylko jednego klienta przeglądarki może być oznaką, że tak naprawdę nie potrzebujesz REST, a po prostu przeprojektowałeś projekt. W takich przypadkach interfejs API CRUD jest realnym rozwiązaniem, a programiści nazywają te interfejsy CRUD API jako REST, ponieważ nie znają różnicy. Oczywiście możesz wdrożyć takiego klienta, ale REST był przeznaczony głównie dla klientów automatycznych (aplikacje po stronie serwera napisane przez programistów, których nawet nie znasz), a nie dla klientów ręcznych (napisane przez ciebie aplikacje przeglądarki). Posiadanie tylko jednego klienta przeglądarki może być oznaką, że tak naprawdę nie potrzebujesz REST, a po prostu przeprojektowałeś projekt. W takich przypadkach interfejs API CRUD jest realnym rozwiązaniem, a programiści nazywają te interfejsy CRUD API jako REST, ponieważ nie znają różnicy.

inf3rno
źródło