2012-10-31 8 views
6

Ich arbeite an einem Projekt, bei dem ich versuche, die Funktion der Software zu enthüllen. Im Grunde habe ich mein Backend eingerichtet und dachte daran, das Frontend aus dem Backend-Code mit JSON-Nachrichten zu trennen. Ich bin etwas verwirrt darüber, was der Unterschied zwischen einem Service und einer API ist. Ich weiß, API kann auf Dienstleistungen oben gebaut werden. Aber ich habe diese beiden Modelle im Hinterkopf - um Profil X mit json-rpc zu erreichenWebdienste - REST vs PHP JSON RPC

http://xyz.com/?request= {"jsonrpc": "2.0", "id": 1, "methode": "getProfile", "params": { "id": "X"}}

oder sollte es so mit REST sein -

http://api.xyz.com/X

Danke

+1

Hier haben Sie einen Vergleich http://stackoverflow.com/questions/1098473/rest-vs-rpc – Chuidiang

+0

Wenn Sie möchten, dass RPC SOAP verwenden. Sonst REST. –

Antwort

20

"Service" vs "API" ist eine ziemlich vage Frage. Oft werden die beiden Begriffe synonym verwendet. "REST" vs "RPC" ist ein wenig einfacher zu erklären.

In der Regel stellt eine URL bei REST eine bestimmte Ressource dar, z. B. "Benutzer", "Konto" usw. Normalerweise können Sie diese Ressourcen mithilfe der HTTP-Methoden POST/GET erstellen/abrufen/aktualisieren/löschen/PUT/LÖSCHEN. Um das Profil zu aktualisieren für Benutzer 1125 möglicherweise die folgende an:

POST /user/1125 HTTP/1.1 
Host: wherever.com 
Content-type: application/x-www-form-urlencoded 

firstName=Davey&lastName=Jones&email=dj%40thebrineydeep.com 

Alles, was Sie mit Benutzer 1125 tun wollten, würden Sie eine Anfrage an die gleichen URL senden. Es gibt Ausnahmen und Varianten dieser Idee, aber das ist der Kern davon.

RPC-Dienste ist mehr wie nur mit einer Funktionsbibliothek, die an eine bestimmte URL gebunden ist. Sie könnten eine ganze Reihe verwandter Funktionen haben, die alle an die URL /services/json gebunden sind. Dann, wenn Sie das Profil für alte Davey Jones ändern wollten, würden Sie:

POST /services/json HTTP/1.1 
Host: wherever.com 
Content-type: application/json 

{ "jsonrpc": "2.0", 
    "id": 1, 
    "method": "setProfile", 
    "params": [ 1125, 
    { "firstName": "Davey", 
     "lastName": "Jones", 
     "email": "[email protected]" 
    } 
    ] 
} 

ich persönlich wie JSON-RPC besser, weil:

  • Ich muss nicht versuchen, und passen alle meine Funktion ruft in eine Art von Ressource-zu-URL-Zuordnung auf, die keinen Sinn ergibt
  • Wir versuchen nicht, die HTTP-Antwortcodes zu überladen, um API-Fehler anzuzeigen. Jede Anfrage gibt eine Antwort von 200 zurück (es sei denn, es liegt ein Serverfehler vor) und Sie wissen vom Antworttext, ob Sie einen Fehler erhalten haben oder nicht. JSON-RPC ist besonders gut darin, Fehlerbedingungen explizit anzugeben.

Manchmal ist REST besser, weil:

  • Manchmal ist die Ressource-to-URL-Mapping wirklich gut passt
  • Es ist intuitiver für Dritte
  • Es bietet ein einfacheres Modell zu verstehen, für nur leicht identifizierbare Informationen

Ich glaube nicht, dass es einfacher ist, einen zu codieren.

Bearbeiten Ich änderte das REST-Beispiel, um die üblicheren formcodierten Daten anstelle von JSON zu verwenden. Natürlich können Sie mit REST jedes beliebige Datenformat angeben. Es ist nicht in Stein gemeißelt.

+0

Danke für die Antwort .. Macht es Sinn, einen "REST-Wrapper" um die RPC-Dienste zu erstellen ... als würde man auf das Benutzerprofil "user1" zugreifen, dann würde der Benutzer tippen - "http://xyz.com/user1 ".. Das würde intern den rpc-service aufrufen, um die Ressource mit der ID" user1 "zu bekommen ?? – Fox

+0

Es ist möglich, vorausgesetzt, Sie haben eine einfache Zuordnung von REST <-> RPC. Trotzdem ist es zusätzliche Arbeit. Sie müssen sich fragen, was Sie daraus gewinnen müssen. Ich würde normalerweise nur mit dem einen oder dem anderen gehen. – slashingweapon

0

Ihre REST-URL entspricht nicht Ihre JSON-RPC-Anfrage.

Zumindest sollte es http://api.example.org/getProfile?id=X

sein Es gibt wirklich nicht viel Unterschied zwischen den beiden. Und Ihr "REST" ist kein echter REST, es sei denn, Sie geben ein Datenformat zurück, das zuverlässig Links zu verschiedenen URLs ausdrücken kann, z. XML oder (X) HTML. Bis diese Anforderung erfüllt ist, sollten Sie sie nur "RESTful" nennen, da Sie wirklich nur HTTP-Methoden verwenden, um Daten auszulösen und Daten hin und her zu verschieben.

Es spielt keine Rolle, was Sie verwenden - es sei denn, Sie kennen oder haben Erfahrung mit Software, die Ihnen hilft, die eine oder andere Lösung schneller als die andere zu erstellen.