Unterschied zwischen REST und CRUD

168

Ich habe REST gelernt und es fühlt sich sehr nach CRUD an (nach dem, was ich über CRUD gelesen habe).

Ich weiß, dass sie unterschiedlich sind, und ich frage mich, ob ich sie nicht verstehe, wenn ich denke, dass sie ähnlich sind.

Ist REST eine "Obermenge" von CRUD? Macht alles CRUD und mehr?

Jesse Black
quelle
17
Zu denken, dass sie ähnlich sind, bedeutet, dass Sie sie verstehen. Beim Lesen der Antworten sehe ich eine überraschende und meiner Meinung nach falsche Ebene darin , die Ähnlichkeiten zwischen den Konzepten nicht anzuerkennen. Ich glaube, dass der richtige Weg, REST zu verstehen, darin besteht , es als "CRUD für HTTP-Ressourcen" zu betrachten. Wenn Sie verstehen, was eine HTTP-Ressource ist (was offensichtlich nicht mit einem Datenbankdatensatz identisch ist) und wissen, was CRUD ist, ist die Beschreibung von REST als "CRUD für HTTP-Ressourcen" eine korrekte und prägnante Methode, um die Essenz von REST zu vermitteln.
Jason Livesay

Antworten:

205

Überraschenderweise sehe ich in den anderen Antworten nicht, was ich für den wirklichen Unterschied zwischen REST und CRUD halte: was jeder schafft.

CRUD bezeichnet die grundlegenden Vorgänge, die in einem Datenrepository ausgeführt werden müssen. Sie bearbeiten Datensätze oder Datenobjekte direkt. Abgesehen von diesen Vorgängen sind die Datensätze passive Einheiten. Normalerweise handelt es sich nur um Datenbanktabellen und Datensätze.

REST hingegen verarbeitet Ressourcendarstellungen, die jeweils durch eine URL gekennzeichnet sind. Dies sind normalerweise keine Datenobjekte, sondern komplexe Objektabstraktionen.

Eine Ressource kann beispielsweise ein Benutzerkommentar sein. Das bedeutet nicht nur einen Datensatz in einer 'Kommentar'-Tabelle, sondern auch die Beziehung zu der' Benutzer'-Ressource, dem Beitrag, an den der Kommentar angehängt ist, oder zu einem anderen Kommentar, auf den er reagiert.

Das Bearbeiten des Kommentars ist keine primitive Datenbankoperation, sondern kann erhebliche Nebenwirkungen haben, z. B. das Auslösen einer Warnung für das ursprüngliche Poster oder das Neuberechnen einiger spielähnlicher "Punkte" oder das Aktualisieren einiger "Follower-Streams".

Außerdem enthält eine Ressourcendarstellung Hypertext (überprüfen Sie das HATEOAS- Prinzip), sodass der Designer Beziehungen zwischen Ressourcen ausdrücken oder den REST-Client im Workflow einer Operation steuern kann.

Kurz gesagt, CRUD ist eine Menge primitiver Operationen (hauptsächlich für Datenbanken und statische Datenspeicher), während REST ein API-Stil auf sehr hoher Ebene ist (hauptsächlich für Webdienste und andere "Live" -Systeme).

Der erste manipuliert Basisdaten, der andere interagiert mit einem komplexen System.

Javier
quelle
3
@Javier Danke, dass du sie auseinander gesetzt hast. Ich habe REST Learning Rails verwendet und den Eindruck gewonnen, es sei ein Ersatz für CRUD (den ich kennengelernt habe seit ... der Name, den ich bereits benutzte, wusste nur nicht, wie ich ihn nennen soll) ... Sie REST vs CRUD hat sich vom Vergleich von 2 Äpfeln mit dem Vergleich von Äpfeln und Orangen abgewandelt. Danke
Jesse Black
2
@Maudicus: Ich denke, es ist sehr verbreitet, da RoR eine CRUD-Ebene enthält (wie die meisten (alle?) Frameworks) und es einfach (automatisch?) Macht, darüber hinaus eine REST-API hinzuzufügen Alles was REST ist. Aber dann können Sie Funktionen zusätzlich zu CRUD, jedoch hinter der REST-API, hinzufügen, wodurch sie sich immer mehr voneinander unterscheiden.
Javier
1
Ihre Antwort ist richtig, aber das Beispiel ist nicht optimal: Ein Kommentar kann sich auf eine einzelne DB-Zeile beschränken, und ist es nicht möglich, dynamische Änderungen an verwandten Objekten mit DB-Triggern durchzuführen? Ich glaube, es gibt ein bisschen mehr als nur rohe Operationen in einer erholsamen API, und Ihre Antwort trägt eindeutig dieses Gefühl gut.
Didierc
2
Also ... gleiche Sache, andere Schicht :)
AlikElzin-kilaka
Vielen Dank, dass Sie dies zum Ausdruck gebracht haben! Ich würde hinzufügen, dass die Beschränkung von HTTP-Verben auf CRUD-Operationen dazu führt, dass REST buchstäblich als CRUD implementiert wird, mit vielen Werkzeugen, die die CRUD-Boilerplate verallgemeinern und einen Platz für diese benutzerdefinierte Logik zur "Bearbeitung eines Kommentars" verpassen.
Sompylasar
99

Erstens sind beide einfach gemeinsame Initialen; Sie sind nichts, wovor man Angst haben muss.

Nun, CRUD ist ein einfacher Begriff, der abgekürzt wurde, weil er in vielen Anwendungen häufig vorkommt, und es ist einfacher, CRUD zu sagen . Es werden die 4 grundlegenden Vorgänge beschrieben, die Sie an Daten (oder einer Ressource) ausführen können. Erstellen, Lesen, Aktualisieren, Löschen.

REST ist jedoch eine benannte Praxis (genau wie AJAX), keine Technologie für sich. Es wird die Verwendung von Funktionen empfohlen, die dem HTTP-Protokoll seit langem eigen sind, jedoch nur selten verwendet werden.

Wenn Sie eine URL (Uniform Resource Locator ) haben und Ihren Browser über die Adresszeile darauf verweisen, senden Sie eine HTTP-Anfrage . Jede HTTP-Anforderung enthält Informationen, anhand derer der Server ermitteln kann, welche HTTP-Antwort an den Client zurückgesendet werden soll, der die Anforderung ausgegeben hat.

Jede Anforderung enthält eine URL, sodass der Server weiß, auf welche Ressource Sie zugreifen möchten. Sie kann jedoch auch eine Methode enthalten . Eine Methode beschreibt, was mit dieser Ressource zu tun ist .

Aber dieses "Methoden" -Konzept wurde nicht sehr oft angewendet.

Normalerweise verlinken die Benutzer nur mit der GET-Methode auf Seiten und geben alle Arten von Aktualisierungen (Löschungen, Einfügungen, Aktualisierungen) mit der POST-Methode aus.

Aus diesem Grund können Sie eine Ressource (URL) nicht als echte Ressource behandeln. Zum Löschen, Einfügen oder Aktualisieren derselben Ressource mussten separate URLs vorhanden sein. Zum Beispiel:

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

Mit REST erstellen Sie intelligentere Formulare, da neben POST auch andere HTTP-Methoden verwendet werden, und programmieren Ihren Server so, dass nicht nur URLs, sondern auch Methoden unterschieden werden können . Also zum Beispiel:

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

Denken Sie daran, dass eine einzelne URL eine einzelne Ressource beschreibt. Ein einzelner Beitrag ist eine einzelne Ressource. Mit REST behandeln Sie Ressourcen so, wie sie behandelt werden sollen. Sie teilen dem Server mit, mit welcher Ressource und wie er umgehen soll.

Zu "RESTful architecture" gibt es viele weitere Funktionen, über die Sie bei Interesse in Wikipedia, anderen Artikeln oder Büchern nachlesen können. CRUD selbst hat nicht viel mehr zu bieten.

Yam Marcovic
quelle
4
Entschuldigung, aber REST ist viel mehr als CRUD. Meistens, weil Ressourcen viel mehr als nur einen Datensatz enthalten, und jede Operation viel mehr als nur das Aktualisieren eines Datensatzes.
Javier
11
Okay. Genau. Warum tut es dir leid? Ich habe nicht gesagt, dass es nicht viel mehr als CRUD ist. Ich denke , das ist genau das, was ich habe zu sagen.
Yam Marcovic
4
Dies sollte die richtige Antwort sein.
Brandon
In der HTML-Spezifikation sind nur die GET- und POST-Methoden für die Formularübermittlung zulässig, sodass die anderen Methoden nicht in Services verwendet wurden, die Anforderungen von Webclients verarbeiten, bevor sich AJAX verbreitet hat. Einige Dienste verwenden ein verstecktes Eingabefeld mit dem Namen "_method" als Problemumgehung, um eine andere Methode als POST anzugeben, während das Formular weiterhin mit der POST-Methode gesendet wird.
Kenneth Sundqvist
20

REST steht für "Representational State Transfer", dh es geht darum, den Status einer Ressource in einem System zu kommunizieren und zu ändern.

REST ist sehr involviert, da die Theorie hinter REST darin besteht, Medien, Hypermedien und ein zugrunde liegendes Protokoll für die Verwaltung von Informationen auf einem Remote-System zu nutzen.

CRUD hingegen ist eine Kurzbezeichnung für die allgemeinen Vorgänge, die Sie für Daten in einer Datenbank benötigen: Erstellen Abrufen Aktualisieren Löschen. Aber tiefer geht es wirklich nicht.

Das ist also die Antwort auf Ihre Frage, aber ich erwähne den allgemeinen Fehler, den ich sehe, wenn REST und CRUD zusammen besprochen werden. Viele Entwickler möchten REST direkt CRUD zuordnen, da REST über HTTP GET PUT POST und DELETE und CRUD CREATE RETRIEVE UPDATE DELETE ermöglicht. Es ist normal, die REST-Verben direkt CRUD-Operationen zuordnen zu wollen.

HTTP verwendet jedoch den Stil "Erstellen oder Aktualisieren", während CRUD das Erstellen und Aktualisieren voneinander trennt. Das macht es unmöglich (!), Eine saubere, allgemeine Zuordnung zwischen den beiden (!)

GET und DELETE sind einfach ... GET === RETRIEVE und DELETE === DELETE.

Gemäß der HTTP-Spezifikation lautet PUT jedoch "Create AND Update" (Erstellen und aktualisieren):

  • Verwenden Sie PUT, um ein brandneues Objekt zu erstellen, wenn Sie alles über es wissen, einschließlich seines Bezeichners

  • Verwenden Sie PUT, um ein Objekt zu aktualisieren (normalerweise mit einer vollständigen Darstellung des Objekts).

POST ist das "Verarbeiten" -Verb und wird als "Anhängen" -Verb betrachtet:

  • Mit POST können Sie ein neues Objekt an eine Sammlung anhängen, dh ein neues Objekt erstellen

  • POST wird auch verwendet, wenn keines der anderen Verben genau passt, da es in der HTTP-Spezifikation als "Datenverarbeitungsverb" definiert ist

  • Wenn Ihr Team auf POST nicht mehr reagiert, denken Sie daran, dass das gesamte WWW auf GET und POST basiert.

Während es also Ähnlichkeiten zwischen REST und CRUD gibt, sehe ich den Fehler, den die meisten Teams machen, darin, eine Äquivalenz zwischen den beiden zu erzielen. Ein Team muss wirklich vorsichtig sein, wenn es eine REST-API definiert, um nicht zu sehr in der CRUD-Mnemonik hängen zu bleiben, da REST als Praxis wirklich eine Menge zusätzlicher Komplexität aufweist, die CRUD nicht sauber zugeordnet werden kann.

rauben
quelle
7

CRUD spezifiziert einen minimalen Satz grundlegender Speicherverben zum Lesen und Schreiben von Daten: Erstellen, Lesen, Aktualisieren und Löschen. Anschließend können Sie andere Operationen erstellen, indem Sie diese aggregieren. Diese werden normalerweise als Datenbankoperationen betrachtet, aber was als Datenbank betrachtet wird, ist willkürlich (z. B. könnte es sich um ein relationales DBMS handeln, aber auch um YAML-Dateien).

REST ist ein "Architekturstil", der normalerweise CRUD-Operationen und andere Operationen auf höherer Ebene umfasst, die alle mit einem bestimmten Konzept von "Ressourcen" ausgeführt werden sollen (willkürlich, dies sind jedoch Entitäten in Ihrer Anwendung). REST weist eine Reihe von Einschränkungen auf , die es interessant machen (und besonders gut zu HTTP passen).

Eine REST-Schnittstelle kann, muss aber nicht alle CRUD-Operationen für eine bestimmte Ressource verfügbar machen. Was in einer REST-Schnittstelle verfügbar ist, ist willkürlich und kann sich aufgrund von Systemberechtigungen, Überlegungen zur Benutzeroberfläche und der Hitze am Tag des Entwurfs und der Erstellung der Schnittstelle ändern. Heißere Tage führen in der Regel zu minimalistischeren Schnittstellen, obwohl das Gegenteil der Fall sein kann.

Dan Rosenstark
quelle
Vielen Dank, Yar. Es scheint mein "Macht alles CRUD und mehr?" ist ein Ja, mit einer Technik von REST gilt mehr als nur Einträge in einer Datenbank.
Jesse Black
@Maudicus Ich habe die Antwort aktualisiert, aber um genau zu sein: es kann aber muss nicht.
Dan Rosenstark
Ich würde nicht sagen, dass Ihre Bewerbung vollständig sein muss. Einige Anwendungen benötigen von Natur aus keine Einfügungen, Entfernungen oder Aktualisierungen.
Yam Marcovic
@ Yam Marcovic, okay, angepasst
Dan Rosenstark
6

CRUD

  • CRUD besteht aus vier grundlegenden Arten von SQL-Befehlen: Erstellen, Lesen, Aktualisieren und Löschen
  • Die meisten Anwendungen verfügen über eine Art CRUD-Funktionalität
  • Eine CRUD-Anwendung verwendet Formulare, um Daten in und aus einer Datenbank abzurufen

SICH AUSRUHEN

  • REST steht für Representational State Transfer. (Es wird manchmal "ReST" geschrieben.)

  • Es basiert auf einem zustandslosen, zwischengespeicherten Client-Server-Kommunikationsprotokoll - und in praktisch allen Fällen wird das HTTP-Protokoll verwendet

  • REST ist ein Architekturstil zum Entwerfen von Netzwerkanwendungen

Vayodya Tamari
quelle
2

REST ist so etwas wie eine Webseite für Maschinen, die sie durchsuchen können, während CRUD so etwas wie SOAP ist, das stark an seine Kunden gekoppelt ist. Das sind die Hauptunterschiede. Ofc. Sie sind äußerlich ähnlich, aber CRUD beschreibt die grundlegende Manipulation von Entitäten, während REST die Benutzeroberfläche jeder Anwendung beschreiben kann. Ein weiterer Unterschied, dass REST mehr als 4 HTTP-Methoden verwenden kann. Es wäre eine sehr lange Antwort, wenn ich alle Unterschiede zusammenfassen möchte. Wenn Sie die Fragen zu REST vs SOAP prüfen, werden Sie die meisten finden.

Ich denke, REST mit CRUD zu verwechseln ist ein sehr häufiger Fehler und die Ursache ist, dass Entwickler nicht die Zeit haben, sich eingehend mit REST zu beschäftigen. Sie möchten die Technologie nur nutzen - ohne sie zu verstehen - basierend auf begrenzten CRUD-Stilbeispielen, die von ähnlichen Entwicklern geschrieben wurden. Die überwiegende Mehrheit der Beispiele und Tutorials spiegelt schwerwiegenden Wissensmangel wider. Die Zuordnung von REST-Ressourcen zu Entitäten und HTTP-Methoden zu CRUD-Operationen dieser Entitäten und die Verwendung von REST ohne Hyperlinks ist nur ein Symptom dafür. Mit REST ordnen Sie Ihren Operationen Hyperlinks (einschließlich Links mit den Methoden POST / PUT / DELETE / PATCH) zu und identifizieren die Operation auf der Clientseite, indem Sie die (normalerweise API-spezifische) Linkbeziehung überprüfen. Wenn ein REST-Client nicht weiß, was eine Verknüpfungsbeziehung ist, und nur die HTTP-Methoden und möglicherweise einige URI-Vorlagen kennt, dann ist das kein REST-Client, sondern ein CRUD-on-HTTP-Client. Ein weiterer häufiger Fehler ist, dass ein REST-Client eine JavaScript-Anwendung mit nur einer Seite ist, die im Browser ausgeführt wird. Natürlich können Sie einen solchen Client implementieren, aber REST war hauptsächlich für automatische Clients (serverseitige Anwendungen, die von Entwicklern geschrieben wurden, die Sie nicht einmal kennen) und nicht für manuelle Clients (benutzergesteuerte Browseranwendungen, die Sie geschrieben haben) gedacht. Ein einziger Browser-Client könnte ein Zeichen dafür sein, dass Sie REST nicht wirklich benötigen und das Projekt nur überarbeitet haben. In diesen Fällen ist eine CRUD-API eine praktikable Lösung, und Entwickler bezeichnen diese CRUD-APIs als REST, da sie den Unterschied nicht kennen. Natürlich können Sie einen solchen Client implementieren, aber REST war hauptsächlich für automatische Clients (serverseitige Anwendungen, die von Entwicklern geschrieben wurden, die Sie nicht einmal kennen) und nicht für manuelle Clients (benutzergesteuerte Browseranwendungen, die Sie geschrieben haben) gedacht. Ein einziger Browser-Client könnte ein Zeichen dafür sein, dass Sie REST nicht wirklich benötigen und das Projekt nur überarbeitet haben. In diesen Fällen ist eine CRUD-API eine praktikable Lösung, und Entwickler bezeichnen diese CRUD-APIs als REST, da sie den Unterschied nicht kennen. Natürlich können Sie einen solchen Client implementieren, aber REST war hauptsächlich für automatische Clients (serverseitige Anwendungen, die von Entwicklern geschrieben wurden, die Sie nicht einmal kennen) und nicht für manuelle Clients (benutzergesteuerte Browseranwendungen, die Sie geschrieben haben) gedacht. Ein einziger Browser-Client könnte ein Zeichen dafür sein, dass Sie REST nicht wirklich benötigen und das Projekt nur überarbeitet haben. In diesen Fällen ist eine CRUD-API eine praktikable Lösung, und Entwickler bezeichnen diese CRUD-APIs als REST, da sie den Unterschied nicht kennen.

inf3rno
quelle