Was ist der Vorteil der Verwendung von REST anstelle von nicht-REST HTTP?

Anscheinend ist REST nur eine Reihe von Konventionen über die Verwendung von HTTP . Ich frage mich, welchen Vorteil diese Konventionen bieten. Weiß jemand?

Ich denke nicht, dass Sie eine gute Antwort darauf bekommen werden, zum Teil, weil niemand wirklich einverstanden ist, was REST ist . Die Wikipedia-Seite ist schwer auf Schlagworte und Licht auf Erklärung. Die Diskussionsseite ist es wert, überflogen zu werden, nur um zu sehen, wie sehr die Leute nicht übereinstimmen. Soweit ich das beurteilen kann, bedeutet REST das:

Anstatt Setter- und Getter-URLs nach dem Zufallsprinzip zu benennen und GET für alle Getter und POST für alle Setter zu verwenden, versuchen wir, die URLs zu identifizieren und dann die HTTP-Aktionen GET , POST , PUT und DELETE zu verwenden . Also statt

 GET /get_article?id=1 POST /delete_article id=1 

Du würdest

 GET /articles/1/ DELETE /articles/1/ 

Und dann entsprechen POST und PUT den “create” – und “update” -Operationen (aber niemand stimmt in welcher Richtung überein).

Ich denke, die Caching-Argumente sind falsch, weil Query-Strings im Allgemeinen zwischengespeichert werden, und außerdem müssen Sie sie nicht wirklich verwenden. Zum Beispiel macht Django so etwas sehr einfach, und ich würde nicht sagen, dass es REST war:

 GET /get_article/1/ POST /delete_article/ id=1 

Oder gib einfach das Verb in die URL ein:

 GET /read/article/1/ POST /delete/article/1/ POST /update/article/1/ POST /create/article/ 

In diesem Fall bedeutet GET etwas ohne Nebenwirkungen, und POST bedeutet etwas, das Daten auf dem Server ändert. Ich denke, das ist vielleicht ein bisschen klarer und einfacher, zumal Sie die ganze PUT -VS- POST Sache vermeiden können. Außerdem können Sie weitere Verben hinzufügen, wenn Sie möchten, damit Sie nicht künstlich an das gebunden sind, was HTTP bietet. Beispielsweise:

 POST /hide/article/1/ POST /show/article/1/ 

(Oder was auch immer, es ist schwer, an Beispiele zu denken, bis sie passieren!)

Schlussendlich gibt es nur zwei Vorteile, die ich sehen kann:

  1. Ihre Web-API ist möglicherweise sauberer und leichter zu verstehen / zu entdecken.
  2. Wenn Sie Daten mit einer Website synchronisieren, ist es wahrscheinlich einfacher, REST zu verwenden, weil Sie einfach sagen können, dass Sie synchronize("/articles/1/") oder was auch immer. Dies hängt stark von Ihrem Code ab.

Aber ich denke, es gibt einige ziemlich große Nachteile:

  1. Nicht alle Aktionen lassen sich leicht CRUD zuordnen (Erstellen, Lesen / Abrufen, Aktualisieren, Löschen). Sie haben möglicherweise nicht einmal mit Objekttypressourcen zu tun.
  2. Es ist ein zusätzlicher Aufwand für zweifelhafte Vorteile.
  3. Verwirrung darüber, auf welche Weise rund PUT und POST sind. Im Englischen meinen sie ähnliche Dinge (“Ich werde eine Nachricht an die Wand schreiben / posten”).

Abschließend würde ich sagen: Wenn Sie nicht wirklich zu dem zusätzlichen Aufwand wechseln möchten oder wenn Ihr Dienst CRUD-Operationen wirklich gut zuordnet, speichern Sie REST für die zweite Version Ihrer API.


Ich bin gerade auf ein weiteres Problem mit REST gestoßen: Es ist nicht einfach, in einer Anfrage mehr als eine Sache zu erledigen oder anzugeben, welche Teile eines zusammengesetzten Objekts Sie erhalten möchten. Dies ist besonders wichtig auf mobilen Geräten, bei denen die Umlaufzeit erheblich sein kann und Verbindungen unzuverlässig sind. Angenommen, Sie erhalten Posts in einer Facebook-Timeline. Der “reine” REST-Weg wäre so etwas wie

 GET /timeline_posts // Returns a list of post IDs. GET /timeline_posts/1/ // Returns a list of message IDs in the post. GET /timeline_posts/2/ GET /timeline_posts/3/ GET /message/10/ GET /message/11/ .... 

Das ist irgendwie lächerlich. Facebook’s API ist ziemlich gut IMO, also lass uns sehen, was sie tun:

Standardmäßig werden die meisten Objekteigenschaften zurückgegeben, wenn Sie eine Abfrage erstellen. Sie können die Felder (oder Verbindungen) auswählen, die mit dem Abfrageparameter “Felder” zurückgegeben werden sollen. Diese URL gibt beispielsweise nur die ID, den Namen und das Bild von Ben zurück: https://graph.facebook.com/bgolub?fields=id,name,picture

Ich habe keine Ahnung, wie Sie so etwas mit REST machen würden und ob Sie es als REST zählen würden. Ich würde sicherlich jeden ignorieren, der versucht, Ihnen zu sagen, dass Sie das nicht tun sollten (vor allem, wenn der Grund ist, “weil es nicht REST ist”)!

REST bedeutet einfach, HTTP so zu verwenden, wie es sein soll.

Sehen Sie sich Roy Fieldings Dissertation über REST an . Ich denke, dass jede Person, die Web-Entwicklung macht, es lesen sollte.

Als eine Anmerkung ist Roy Fielding einer der Schlüsseltreiber hinter dem HTTP-Protokoll.

Um einige der Vorteile zu nennen:

  • Einfach.
  • Sie können den HTTP-Cache und den Proxy-Server gut nutzen, um mit hoher Auslastung fertig zu werden.
  • Es hilft Ihnen, auch eine sehr komplexe Anwendung in einfache Ressourcen zu organisieren.
  • Es erleichtert neuen Clients, Ihre Anwendung zu verwenden, auch wenn Sie sie nicht speziell für sie entwickelt haben (wahrscheinlich, weil sie bei der Erstellung Ihrer App nicht vorhanden waren).

Einfach ausgedrückt: KEINE .

Fühlen Sie sich frei, zu downvote, aber ich denke immer noch, dass es keine wirklichen Vorteile gegenüber nicht-REST HTTP gibt. Alle aktuellen Antworten sind ungültig. Argumente aus der aktuell meistgewählten Antwort:

  • Einfach.
  • Sie können den HTTP-Cache und den Proxy-Server gut nutzen, um mit hoher Auslastung fertig zu werden.
  • Es hilft Ihnen, auch eine sehr komplexe Anwendung in einfache Ressourcen zu organisieren.
  • Es erleichtert neuen Clients, Ihre Anwendung zu verwenden, auch wenn Sie sie nicht speziell für sie entwickelt haben (wahrscheinlich, weil sie bei der Erstellung Ihrer App nicht vorhanden waren).

1. Einfach

Mit REST benötigen Sie zusätzliche Kommunikationsebene für Ihre serverseitigen und clientseitigen Skripts => es ist tatsächlich komplizierter als die Verwendung von nicht-REST HTTP.

2. Zwischenspeichern

Caching kann über HTTP-Header gesteuert werden, die vom Server gesendet werden. REST fügt keine Features hinzu, die in nicht-REST fehlen.

3. Organisation

REST hilft Ihnen nicht, Dinge zu organisieren. Sie werden gezwungen, die von der serverseitigen Bibliothek unterstützte API zu verwenden. Sie können Ihre Anwendung auf die gleiche Weise (oder besser) organisieren, wenn Sie einen Nicht-REST-Ansatz verwenden. Siehe zB Model-View-Controller oder MVC-Routing .

4. Einfach zu bedienen / zu implementieren

Überhaupt nicht wahr. Alles hängt davon ab, wie gut Sie Ihre Anwendung organisieren und dokumentieren. REST wird Ihre Anwendung nicht magisch verbessern.

IMHO ist der größte Vorteil, den REST ermöglicht, die Reduzierung der Client / Server-Kopplung. Es ist viel einfacher, eine REST-Schnittstelle im Laufe der Zeit zu entwickeln, ohne bestehende Clients zu unterbrechen.

Auffindbarkeit

Jede Ressource hat Verweise auf andere Ressourcen, entweder in einer Hierarchie oder in Links, so dass es einfach ist, sich umzusehen. Dies ist ein Vorteil für den Menschen, der den Klienten entwickelt und er / sie davon abhält, die Dokumente ständig zu konsultieren und Vorschläge zu machen. Es bedeutet auch, dass der Server Ressourcennamen einseitig ändern kann (solange die Client-Software die URLs nicht fest codiert).

Kompatibilität mit anderen Tools

Sie können Ihren Weg in jeden Teil der API CURL oder verwenden Sie den Web-Browser, um Ressourcen zu navigieren. Erleichtert das Debuggen und Testen der Integration.

Standardisierte Verbnamen

Ermöglicht Ihnen, Aktionen festzulegen, ohne den richtigen Wortlaut suchen zu müssen. Stellen Sie sich vor, wenn OOP-Getter und Setter nicht standardisiert sind und einige Leute stattdessen retrieve und define . Sie müssten sich das korrekte Verb für jeden einzelnen Zugangspunkt merken. Zu wissen, dass nur eine Handvoll Verben verfügbar ist, kontert dieses Problem.

Standardisierter Status

Wenn Sie eine Ressource GET , die nicht vorhanden ist, können Sie sicher sein, dass in einer RESTful-API ein 404 Fehler auftritt. Vergleichen Sie es mit einer nicht-RESTful-API, die möglicherweise {error: "Not found"} in Gott weiß, wie viele Ebenen enthalten ist. Wenn Sie den zusätzlichen Speicherplatz benötigen, um eine Nachricht an den Entwickler auf der anderen Seite zu schreiben, können Sie immer den Hauptteil der Antwort verwenden.

Beispiel

Stellen Sie sich zwei APIs mit derselben functionalität vor, eine nach REST und die andere nicht. Stellen Sie sich nun folgende Clients für diese APIs vor:

RESTful:

 GET /products/1052/reviews POST /products/1052/reviews "5 stars" DELETE /products/1052/reviews/10 GET /products/1052/reviews/10 

HTTP:

 GET /reviews?product_id=1052 POST /post_review?product_id=1052 "5 stars" POST /remove_review?product_id=1052&review_id=10 GET /reviews?product_id=1052&review=10 

Denken Sie jetzt an die folgenden Fragen:

  • Wenn der erste Anruf jedes Kunden funktioniert, wie sicher können Sie sein, dass der Rest auch funktioniert?

  • Es gab eine wichtige Aktualisierung der API, die diese Zugriffspunkte möglicherweise geändert hat oder nicht. Wie viel von den Dokumenten müssen Sie erneut lesen?

  • Können Sie die Rückgabe der letzten Abfrage vorhersagen?

  • Sie müssen die Rezension bearbeiten (bevor Sie sie löschen). Können Sie dies tun, ohne die Dokumente zu überprüfen?

Ich empfehle, Ryan Tomaykos Wie ich REST zu meiner Frau erklärte

Bearbeitung durch Dritte

Auszug aus dem waybackmaschine Link:

Wie wäre es mit einem Beispiel? Du bist ein Lehrer und möchtest Schüler verwalten:

  • In welchen classn sind sie,
  • welche Noten sie bekommen,
  • Notfallkontakte,
  • Informationen über die Bücher, von denen du lehrst usw.

Wenn die Systeme webbasiert sind, dann gibt es wahrscheinlich eine URL für jedes der beteiligten Substantive: student, teacher, class, book, room, etc … Wenn es für jede URL eine maschinenlesbare Darstellung gäbe, wäre es trivial, neue Tools in das System zu integrieren, da alle diese Informationen auf eine standardmäßige Weise konsumierbar wären. … könnte man ein landesweites System aufbauen, das mit jedem einzelnen Schulsystem sprechen kann, um Testergebnisse zu sammeln.

Jedes der Systeme würde Informationen voneinander unter Verwendung eines einfachen HTTP GET erhalten. Wenn ein System etwas zu einem anderen System hinzufügen muss, würde es einen HTTP-POST verwenden. Wenn ein System etwas in einem anderen System aktualisieren möchte, verwendet es ein HTTP-PUT. Es bleibt nur noch zu klären, wie die Daten aussehen sollen.

Ich würde jedem empfehlen, der eine Antwort auf diese Frage sucht, diese “Slideshow” durchzugehen .

Ich konnte nicht verstehen, was REST ist und warum es so cool ist, seine Vor- und Nachteile, Unterschiede zu SOAP – aber diese Slideshow war so brillant und einfach zu verstehen, so dass es mir jetzt viel klarer ist als zuvor.

Zwischenspeichern

Es gibt noch andere tiefgreifende Vorteile von REST, die sich um die Entwicklungsfähigkeit über lose Kopplung und Hypertext drehen, aber Caching-Mechanismen sind der Hauptgrund, warum Sie sich um REST-konformes HTTP kümmern sollten.

Es ist in der Fielding-Dissertation niedergeschrieben . Aber wenn Sie nicht viel lesen wollen:

  • erhöhte Skalierbarkeit (aufgrund von Statusless-, Cache- und Layered-System-Constraints)
  • Entkoppelter Client und Server (aufgrund staatenloser und einheitlicher Schnittstellenbeschränkungen)
    • Wiederverwendbare Clients (der Client kann allgemeine REST-Browser und RDF-Semantik verwenden, um zu entscheiden, welcher Link folgen und wie die Ergebnisse angezeigt werden sollen)
    • nicht brechende Clients (Clients brechen nur durch anwendungsspezifische semantische Änderungen, da sie die Semantik anstelle von API-spezifischem Wissen verwenden)
  • Gib jeder “Ressource” eine ID
  • Verknüpfen Sie die Dinge miteinander
  • Verwenden Sie Standardmethoden
  • Ressourcen mit mehreren Darstellungen
  • Kommunizieren Sie staatenlos

Es ist möglich, alles nur mit POST und GET zu machen? Ja, ist es der beste Ansatz? Nein, warum? weil wir Standardmethoden haben. Wenn Sie noch einmal darüber nachdenken, wäre es möglich, alles nur mit GET zu erledigen. Warum sollten wir uns also überhaupt noch mit POST beschäftigen? Wegen der Standards!

Wenn Sie beispielsweise heute an ein MVC-Modell denken, können Sie Ihre Anwendung darauf beschränken, nur auf bestimmte Arten von Verben wie POST, GET, PUT und DELETE zu reagieren. Selbst wenn unter der Haube alles zu POST und GET emuliert wird, macht es keinen Sinn, verschiedene Verben für verschiedene Aktionen zu haben?

Discovery ist in REST viel einfacher. Wir haben WADL-Dokumente (ähnlich wie WSDL in traditionellen Webservices), die Ihnen helfen werden, Ihren Service für die Welt zu bewerben. Sie können auch UDDI-Entdeckungen verwenden. Bei herkömmlichen HTTP POST- und GET-Nachrichten kennen die Benutzer Ihre Nachrichtenanforderung und Antwortschemas möglicherweise nicht, um Sie anzurufen.

Ein Vorteil ist, dass wir XML-Dokumente sequentiell verarbeiten und XML-Daten aus verschiedenen Quellen wie InputStream-Objekt, URL, DOM-Knoten entpacken können.

@Timmmm, über deine Bearbeitung:

 GET /timeline_posts // could return the N first posts, with links to fetch the next/previous N posts 

Dies würde die Anzahl der Anrufe drastisch reduzieren

Und nichts hindert Sie daran, einen Server zu entcasting, der HTTP-Parameter akzeptiert, um die Feldwerte zu kennzeichnen, die Ihre Kunden wünschen …

Aber das ist ein Detail.

Viel wichtiger ist die Tatsache, dass Sie keine großen Vorteile des REST-Architekturstils erwähnen (viel bessere Skalierbarkeit aufgrund von Server-Statuslosigkeit, viel bessere Verfügbarkeit, auch aufgrund von Server-Statuslosigkeit, viel bessere Nutzung der Standard-Dienste wie Caching für Beispiel, wenn ein REST-Architekturstil verwendet wird, viel geringere Kopplung zwischen Client und Server aufgrund der Verwendung einer einheitlichen Schnittstelle usw.

Was deine Bemerkung betrifft

“Nicht alle Aktionen können leicht CRUD zugeordnet werden (Erstellen, Lesen / Abrufen, Aktualisieren, Löschen).”

: Ein RDBMS verwendet auch einen CRUD-Ansatz (SELECT / INSERT / DELETE / UPDATE), und es gibt immer eine Möglichkeit, ein Datenmodell darzustellen und darauf zu reagieren.

In Bezug auf deinen Satz

“Möglicherweise beschäftigen Sie sich nicht einmal mit Objekttypressourcen”

: Ein RESTful-Design ist im Wesentlichen ein einfaches Design – aber das bedeutet nicht, dass es einfach zu gestalten ist. Siehst du den Unterschied? Sie müssen viel über die Konzepte nachdenken, die Ihre Anwendung darstellen und handhaben wird, was Sie tun müssen, wenn Sie dies vorziehen, um dies mit Hilfe von Ressourcen darzustellen. Aber wenn Sie dies tun, werden Sie mit einem einfacheren und effizienteren Design enden.

Query-Strings können von Suchmaschinen ignoriert werden.