Webdienstunterschiede zwischen REST und RPC


98

Ich habe einen Webdienst, der JSON-Parameter akzeptiert und bestimmte URLs für Methoden hat, z.

http://IP:PORT/API/getAllData?p={JSON}

Dies ist definitiv kein REST, da es nicht staatenlos ist. Es berücksichtigt Cookies und hat eine eigene Sitzung.

Ist es RPC? Was ist der Unterschied zwischen RPC und REST?


1
Warum ist es wichtig, ob es REST oder RPC ist? Was ist dein Grund zu fragen?
Bogdan

5
Der Service gehört nicht mir und besagt, dass es sich um REST handelt, aber es scheint nicht so zu sein. Ich wollte herausfinden, ob ich mich irre, dass es nicht REST ist.
Mazmart

98
@ Bogdan Wissen ist der Grund.
Sir

Antworten:


68

Sie können keine klare Trennung zwischen REST und RPC vornehmen, indem Sie sich nur ansehen, was Sie gepostet haben.

Eine Einschränkung von REST ist, dass es zustandslos sein muss. Wenn Sie eine Sitzung haben, haben Sie den Status, sodass Sie Ihren Dienst nicht RESTful aufrufen können.

Die Tatsache, dass Ihre URL eine Aktion enthält (dh getAllData), ist ein Hinweis auf RPC. In REST tauschen Sie Repräsentationen aus und die von Ihnen ausgeführte Operation wird von den HTTP-Verben bestimmt. Außerdem wird in REST die Inhaltsverhandlung nicht mit a durchgeführt?p={JSON} Parameter durchgeführt.

Ich weiß nicht, ob Ihr Dienst RPC ist, aber er ist nicht RESTful. Sie können den Unterschied online erfahren. Hier ist ein Artikel, der Ihnen den Einstieg erleichtert : Entlarven der Mythen von RPC & REST . Sie wissen besser, was in Ihrem Service enthalten ist. Vergleichen Sie also die Funktionen mit denen von RPC und ziehen Sie Ihre eigenen Schlussfolgerungen.


RESTful bedeutet also, dass alle Standards außer REST eingehalten werden, wenn es sich möglicherweise dafür entscheidet, Standards nicht zu befolgen.
Mazmart

3
@ Mazmart: REST ist eine Reihe von Richtlinien und Einschränkungen. Es ist keine Spezifikation, die man implementieren kann und wenn sie behaupten, einen RESTful-Service zu haben. Soweit ich bemerkt habe, bezeichnen die Leute die meisten Dinge, die nicht SOAP sind, als REST, obwohl es sich tatsächlich nur um eine andere Art von RPC handelt.
Bogdan

119

Betrachten Sie das folgende Beispiel für HTTP-APIs, mit denen Bestellungen in einem Restaurant modelliert werden.

  • Die RPC-API denkt in "Verben", stellt die Restaurantfunktionalität als Funktionsaufrufe bereit, die Parameter akzeptieren, und ruft diese Funktionen über das HTTP-Verb auf, das am besten geeignet erscheint - ein "Get" für eine Abfrage usw., aber den Namen des Verbs ist rein zufällig und hat keinen wirklichen Einfluss auf die tatsächliche Funktionalität, da Sie jedes Mal eine andere URL aufrufen . Rückgabecodes sind handcodiert und Teil des Servicevertrags.
  • Im Gegensatz dazu modelliert die REST-API die verschiedenen Entitäten innerhalb der Problemdomäne als Ressourcen und verwendet HTTP-Verben, um Transaktionen für diese Ressourcen darzustellen - POST zum Erstellen, PUT zum Aktualisieren und GET zum Lesen. Alle diese Verben, die unter derselben URL aufgerufen werden , bieten unterschiedliche Funktionen. Allgemeine HTTP-Rückkehrcodes werden verwendet, um den Status der Anforderungen zu übermitteln.

Eine Bestellung aufgeben:

Bestellung abrufen:

Aktualisieren einer Bestellung:

Beispiel aus sites.google.com/site/wagingguerillasoftware/rest-series/what-is-restful-rest-vs-rpc


32
Zum Schluss noch ein paar URL-Beispiele.
Fabian Picone

3
Ich stimme nicht mit Ihren Aussagen zu URLs überein. Sie können sehr viel alle RPC-Aufrufe auf derselben URL und REST auf verschiedenen URLs haben. Sie zeigen nur eine Seite der Medaille.
K - Die Toxizität in SO nimmt zu.

Was Sie hier beschreiben, ist nicht REST - REST ist ein Architekturmuster. Was Sie beschreiben, ist REST über HTTP, woran die meisten Leute denken, wenn sie über REST sprechen.
d4nyll

34

Wie andere gesagt haben, besteht ein wesentlicher Unterschied darin, dass REST nomenzentriert und RPC verbzentriert ist. Ich wollte nur diese übersichtliche Tabelle mit Beispielen einfügen, die Folgendes demonstrieren:

--------------------------- + ---------------------- --------------- + --------------------------
  Betrieb                  | RPC (Operation)                      | REST (Ressource)
--------------------------- + ---------------------- --------------- + --------------------------
 Anmeldung | POST / Anmeldung | POST / Personen           
--------------------------- + ---------------------- --------------- + --------------------------
 Rücktritt | POST / Rücktritt | LÖSCHEN / Personen / 1234    
--------------------------- + ---------------------- --------------- + --------------------------
 Person lesen | GET / readPerson? Personid = 1234 | GET / Personen / 1234       
--------------------------- + ---------------------- --------------- + --------------------------
 Artikelliste der Person lesen | GET / readUsersItemsList? Userid = 1234 | GET / Personen / 1234 / Artikel
--------------------------- + ---------------------- --------------- + --------------------------
 Element zur Liste der Person hinzufügen | POST / addItemToUsersItemsList | POST / Personen / 1234 / Artikel
--------------------------- + ---------------------- --------------- + --------------------------
 Element aktualisieren | POST / modifyItem | PUT / items / 456          
--------------------------- + ---------------------- --------------- + --------------------------
 Element löschen | POST / removeItem? ItemId = 456 | LÖSCHEN / Artikel / 456       
--------------------------- + ---------------------- --------------- + --------------------------

Anmerkungen

  • Wie die Tabelle zeigt, verwendet REST in der Regel URL-Pfadparameter, um bestimmte Ressourcen zu identifizieren
    (z. B. GET /persons/1234), während RPC in der Regel Abfrageparameter für Funktionseingaben verwendet
    (z GET /readPerson?personid=1234. B. ).
  • In der Tabelle ist nicht dargestellt, wie eine REST-API mit der Filterung umgehen würde, die normalerweise Abfrageparameter (z GET /persons?height=tall. B. ) umfasst.
  • Ebenfalls nicht gezeigt ist, wie bei beiden Systemen beim Erstellen / Aktualisieren von Vorgängen wahrscheinlich zusätzliche Daten über den Nachrichtentext übergeben werden (z. B. wenn Sie dies tun POST /signupoder POST /personsDaten einschließen, die die neue Person beschreiben).
  • Natürlich ist nichts davon in Stein gemeißelt, aber es gibt Ihnen eine Vorstellung davon, was Sie wahrscheinlich antreffen und wie Sie Ihre eigene API aus Gründen der Konsistenz organisieren möchten. Weitere Informationen zum REST-URL-Design finden Sie in dieser Frage .

27

Es ist RPC mit http . Eine korrekte Implementierung von REST sollte sich von RPC unterscheiden. Eine Logik zum Verarbeiten von Daten wie eine Methode / Funktion zu haben, ist RPC. getAllData () ist eine intelligente Methode. REST kann keine Intelligenz haben, es sollten Speicherauszugsdaten sein, die von einer externen Intelligenz abgefragt werden können .

Die meisten Implementierungen, die ich heutzutage gesehen habe, sind RPC, aber viele nennen es fälschlicherweise REST. REST mit HTTP ist der Retter und SOAP mit XML der Bösewicht. Ihre Verwirrung ist also berechtigt und Sie haben Recht, es ist nicht REST.

Das HTTP-Protokoll führt keine Implementierung von REST durch. Sowohl REST (GET, POST, PUT, PATCH, DELETE) als auch RPC (GET + POST) können über HTTP entwickelt werden (z. B. über ein Web-API-Projekt in Visual Studio).

Gut, aber was ist dann REST? Das Richardson-Reifegradmodell ist unten angegeben (zusammengefasst). Nur Level 3 ist RESTful.

  • Stufe 0: HTTP-POST
  • Stufe 1: Jede Ressource / Entität hat einen URI (aber immer noch nur POST)
  • Stufe 2: Sowohl POST als auch GET können verwendet werden
  • Stufe 3 (RESTful): Verwendet HATEOAS (Hyper Media Links) oder mit anderen Worten selbsterkundende Links

zB: Stufe 3 (HATEOAS):

  1. Der Link gibt an, dass dieses Objekt auf diese Weise aktualisiert und auf diese Weise hinzugefügt werden kann.

  2. Link gibt an, dass dieses Objekt nur gelesen werden kann und so machen wir es.

    Das Senden von Daten reicht natürlich nicht aus, um REST zu werden, aber es sollte auch erwähnt werden, wie die Daten abgefragt werden. Aber warum die 4 Schritte? Warum kann es nicht nur Schritt 4 sein und es REST nennen? Richardson hat uns nur einen schrittweisen Ansatz gegeben, um dorthin zu gelangen, das ist alles.

Sie haben Websites erstellt, die von Menschen verwendet werden können. Aber können Sie auch Websites erstellen, die von Maschinen verwendet werden können? Hier liegt die Zukunft, und RESTful Web Services zeigt Ihnen, wie es geht.

PS: REST ist sehr beliebt, ebenso wie automatisierte Tests, aber wenn es um Beispiele aus der Praxis geht.


1
Der erste Absatz erklärt den Unterschied auf sehr einfache und unkomplizierte Weise. Habe meine +1 :)
Nikolas

12

REST lässt sich am besten für die Arbeit mit den Ressourcen beschreiben, wobei es bei RPC mehr um die Aktionen geht.

REST steht für Representational State Transfer. Es ist eine einfache Möglichkeit, Interaktionen zwischen unabhängigen Systemen zu organisieren. RESTful-Anwendungen verwenden normalerweise HTTP-Anforderungen, um Daten zu veröffentlichen (zu erstellen und / oder zu aktualisieren), Daten zu lesen (z. B. Abfragen zu stellen) und Daten zu löschen. Somit kann REST HTTP für alle vier CRUD-Vorgänge (Erstellen / Lesen / Aktualisieren / Löschen) verwenden.

RPC wird im Wesentlichen zur Kommunikation zwischen den verschiedenen Modulen verwendet, um Benutzeranforderungen zu erfüllen. zB In Openstack wie Nova, Blick und Neutron beim Booten einer virtuellen Maschine zusammenarbeiten.


4

Ich würde so argumentieren:

Besitzt / besitzt meine Entität die Daten? Dann RPC: Hier ist eine Kopie einiger meiner Daten. Bearbeiten Sie die Datenkopie, die ich Ihnen sende, und senden Sie mir eine Kopie Ihres Ergebnisses zurück.

Besitzt / besitzt die angerufene Entität die Daten? Dann REST: entweder (1) zeige mir eine Kopie einiger deiner Daten oder (2) manipuliere einige deiner Daten.

Letztendlich geht es darum, welche "Seite" der Aktion die Daten besitzt / hält. Und ja, Sie können REST-Wörter verwenden, um mit einem RPC-basierten System zu sprechen, aber Sie werden trotzdem RPC-Aktivitäten ausführen, wenn Sie dies tun.

Beispiel 1: Ich habe ein Objekt, das über ein DAO mit einem relationalen Datenbankspeicher (oder einem anderen Datenspeichertyp) kommuniziert. Es ist sinnvoll, den REST-Stil für diese Interaktion zwischen meinem Objekt und dem Datenzugriffsobjekt zu verwenden, das als API vorhanden sein kann. Meine Entität besitzt / hält die Daten nicht, die relationale Datenbank (oder der nicht relationale Datenspeicher).

Beispiel 2: Ich muss viel komplexe Mathematik machen. Ich möchte nicht eine Reihe von mathematischen Methoden in mein Objekt laden, sondern nur einige Werte an etwas anderes übergeben, das alle Arten von Mathematik ausführen kann, und ein Ergebnis erhalten. Dann ist der RPC-Stil sinnvoll, da das mathematische Objekt / die mathematische Entität meinem Objekt eine ganze Reihe von Operationen zur Verfügung stellt. Beachten Sie, dass diese Methoden möglicherweise alle als einzelne APIs verfügbar gemacht werden und ich sie mit GET aufrufen kann. Ich kann sogar behaupten, dass dies RESTful ist, weil ich über HTTP GET anrufe, aber wirklich unter dem Deckmantel ist es RPC. Meine Entität besitzt / hält die Daten, die entfernte Entität führt nur Manipulationen an den Kopien der Daten durch, die ich an sie gesendet habe.


4

Über HTTP sind beide nur HttpRequestObjekte und erwarten beide ein HttpResponseObjekt zurück. Ich denke, man kann mit dieser Beschreibung weiter codieren und sich um etwas anderes kümmern.


2

Hier gibt es viele gute Antworten. Ich würde Sie trotzdem auf diesen Google-Blog verweisen, da er die Unterschiede zwischen RPC und REST sehr gut diskutiert und etwas erfasst, das ich in keiner der Antworten hier gelesen habe.

Ich würde einen Absatz aus demselben Link zitieren, der mir aufgefallen ist:

REST selbst ist eine Beschreibung der Designprinzipien, die HTTP und dem World Wide Web zugrunde liegen. Da HTTP jedoch die einzige kommerziell wichtige REST-API ist, können wir die Diskussion über REST größtenteils vermeiden und uns nur auf HTTP konzentrieren. Diese Substitution ist nützlich, da es viel Verwirrung und Variabilität in der Bedeutung von REST im Kontext von APIs gibt, aber es gibt viel mehr Klarheit und Übereinstimmung darüber, was HTTP selbst ist. Das HTTP-Modell ist die perfekte Umkehrung des RPC-Modells. Im RPC-Modell sind die adressierbaren Einheiten Prozeduren, und die Entitäten der Problemdomäne sind hinter den Prozeduren verborgen. Im HTTP-Modell sind die adressierbaren Einheiten die Entitäten selbst, und das Verhalten des Systems ist als Nebeneffekte beim Erstellen, Aktualisieren oder Löschen hinter den Entitäten verborgen.


1

So verstehe und verwende ich sie in verschiedenen Anwendungsfällen:

Beispiel: Restaurantmanagement

Anwendungsfall für REST : Auftragsverwaltung

- create order (POST), update order (PATCH), cancel order (DELETE), retrieve order (GET)
- endpoint: /order?orderId=123

Für das Ressourcenmanagement ist REST sauber. Ein Endpunkt mit vordefinierten Aktionen. Es kann eine Möglichkeit gesehen werden, eine DB (SQL oder NoSQL) oder Klasseninstanzen der Welt zugänglich zu machen.

Implementierungsbeispiel:

class order:
    on_get(self, req, resp): doThis.
    on_patch(self, req, resp): doThat.

Framework-Beispiel: Falcon für Python.

Anwendungsfall für RPC : Operations Management

- prepare ingredients: /operation/clean/kitchen
- cook the order: /operation/cook/123
- serve the order /operation/serve/123

Für analytische, betriebliche, nicht reagierende, nicht repräsentative, handlungsbasierte Jobs funktioniert RPC besser und es ist sehr natürlich, funktional zu denken.

Implementierungsbeispiel:

@route('/operation/cook/<orderId>')
def cook(orderId): doThis.

@route('/operation/serve/<orderId>')
def serve(orderId): doThat.

Framework-Beispiel: Flasche für Python

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.