REST vs JSON-RPC? [chiuso]


251

Sto cercando di scegliere tra REST e JSON-RPC per lo sviluppo di un'API per un'applicazione Web. Come si confrontano?

Aggiornamento 2015: ho scoperto che REST è più facile da sviluppare e utilizzare per un'API fornita su Web / HTTP, poiché l'API può sfruttare il protocollo HTTP esistente e maturo, compreso sia dal client che dal server. Ad esempio, l'API può utilizzare codici di risposta, intestazioni, query, corpi dei post, memorizzazione nella cache e molte altre funzioni senza alcuno sforzo o impostazione aggiuntiva.


29
REST è sicuramente la risposta popolare in questo momento. Non sono convinto che sia sempre la risposta giusta però. Potrebbe esserci una discrepanza di impedenza tra un'API REST incentrata sulle risorse e un dominio problematico che è intrinsecamente basato su attività o flusso di lavoro. Se scopri che devi fare diversi tipi di PATCH alla stessa risorsa o che determinate attività non sono mappate a una risorsa specifica, allora devi iniziare a piegare il paradigma REST. Usi azioni / comandi come risorse. Differenzia i tipi di comando nell'intestazione Content-Type come parametri? Non sono sicuro che ci sia una risposta per tutte le dimensioni.
Landon Poch il

27
JSON-RPC è semplice e coerente, una gioia da usare.
dnault

1
È agosto 2015, ho implementato client e server utilizzando REST, i primi 2 giorni sono stati di apprendimento, quindi ho capito perché era popolare. È stata una vera gioia una volta creata una piccola app, il client non ha davvero alcun lavoro per ricordare i vari percorsi dell'URL, il server su node.js e il client in javascript hanno condiviso la stessa struttura (percorsi dell'URL) per comunicare. Wow! è stato molto rapido, il prodotto è stato consegnato in soli 15 giorni, anche scrivendo da zero. REST è la strada da percorrere. Nota anche che il popolare Apache CouchDB utilizza REST, un ottimo database, sono molto orgogliosi di averlo fatto anche in REST. In parole semplici, REST è GIUSTO (corretto) con un'interfaccia pulita.
Manohar Reddy Poreddy,

6
Dipende dai vincoli che hai o dal tuo obiettivo principale. Ad esempio, se le prestazioni sono un aspetto importante, la tua strada da percorrere è JSON-RPC (ad es. High Performance Computing). Se il tuo obiettivo principale è essere agnostico in modo da fornire un'interfaccia generica che possa essere interpretata da altri, la tua strada da percorrere è REST. Se si desidera entrambi gli obiettivi, è necessario includere entrambi i protocolli. Le tue esigenze definiscono la soluzione.
Stathis Andronikos,

@StathisAndronikos Hai ragione, il mio obiettivo principale era la facilità d'uso e una buona prestazione per le app web (non HPC).
Ali Shakiba,

Risposte:


221

Il problema fondamentale con RPC è l'accoppiamento. I client RPC sono strettamente associati all'implementazione del servizio in diversi modi e diventa molto difficile cambiare l'implementazione del servizio senza interrompere i client:

  • I clienti sono tenuti a conoscere i nomi delle procedure;
  • L'ordine dei parametri di procedura, i tipi e il conteggio contano. Non è così facile cambiare le firme delle procedure (numero di argomenti, ordine degli argomenti, tipi di argomenti ecc ...) sul lato server senza interrompere le implementazioni del client;
  • Lo stile RPC non espone altro che endpoint di procedura + argomenti di procedura. È impossibile per il cliente determinare cosa si può fare dopo.

D'altra parte in stile REST è molto facile guidare i clienti includendo le informazioni di controllo nelle rappresentazioni (intestazioni HTTP + rappresentazione). Per esempio:

  • È possibile (e in realtà obbligatorio) incorporare collegamenti annotati con tipi di relazioni di collegamento che trasmettano significati di questi URI;
  • Le implementazioni del client non devono dipendere da particolari nomi e argomenti della procedura. Al contrario, i client dipendono dai formati dei messaggi. Ciò crea la possibilità di utilizzare librerie già implementate per particolari formati multimediali (ad esempio Atom, HTML, Collection + JSON, HAL ecc ...)
  • È possibile modificare facilmente gli URI senza interrompere i client nella misura in cui dipendono solo da relazioni di collegamento registrate (o specifiche del dominio);
  • È possibile incorporare strutture simili a forme nelle rappresentazioni, dando ai clienti la possibilità di esporre queste descrizioni come funzionalità dell'interfaccia utente se l'utente finale è umano;
  • Il supporto per la memorizzazione nella cache è un ulteriore vantaggio;
  • Codici di stato standardizzati;

Ci sono molte più differenze e vantaggi sul lato REST.


20
Cosa intendi con "è obbligatorio incorporare collegamenti annotati con tipi di relazioni di collegamento che trasmettano significati ..."?
pjz,

129
"I client sono tenuti a conoscere i nomi delle procedure" - questo non è un argomento perché con REST questo nome è codificato nell'URI anziché passare come parametro. Altrimenti il ​​server non saprà quale metodo dovrebbe eseguire.
Centurion,

44
"Non è così facile cambiare le firme delle procedure ... sul lato server senza interrompere le implementazioni dei client", anche questo è discutibile. Sia REST che JSON-RPC non sono SOAP e non dispongono di WSDL che descrive i servizi Web esistenti e i loro tipi in modo che possano essere utilizzati per il cambiamento dinamico sul lato client. Quindi, in entrambi i casi, se si modifica il servizio Web, è necessario modificare il client. Altrimenti devi andare con SOAP.
Centurion,

64
Ho codificato un gran numero di app e non ho ancora visto alcun servizio web flessibile. Se si modificano back-end e servizi Web rispetto al client, è sempre necessario effettuare il refactoring / l'aggiornamento per soddisfare i nuovi requisiti. E ho citato SOAP e perché ha qualcosa che offre flessibilità, come WSDL, quindi puoi automatizzare qualcosa e avere maggiore flessibilità perché puoi ottenere informazioni su set di risultati, tipi di dati e servizi web disponibili. REST e altri non lo hanno affatto. Quindi né REST, né JSON-RPC, né altri tipi di servizi Web ti daranno magie che eliminerebbero la necessità di un aggiornamento manuale dei client.
Centurion,

15
Per me, il mio attuale team e quelli precedenti, i servizi web RESTful sono per applicazioni di tipo CRUD. Riguardo a "Riscriviamo i browser ogni volta che qualcosa cambia sul server?" - no, poiché i browser sono solo esecutori HTTP, non hanno nulla a che fare con la logica aziendale, che il programma client deve implementare (mostra schermate, esegui cose correlate). Sembra che abbiamo iniziato la guerra alla fiamma, ma in generale vorrei avere un'altra solida fonte per i servizi web RESTfull con un flusso di utilizzo pratico, con la magica flessibilità a cui ti riferisci. Nel frattempo molte affermazioni sono troppo vaghe.
Centurion,

163

Ho esplorato il problema in dettaglio e ho deciso che il puro REST è troppo limitante, e RPC è il migliore, anche se la maggior parte delle mie app sono app CRUD. Se ti attieni a REST, alla fine ti gratterai la testa chiedendoti come puoi facilmente aggiungere un altro metodo necessario alla tua API per uno scopo speciale. In molti casi, l'unico modo per farlo con REST è creare un altro controller per questo, il che potrebbe complicare indebitamente il programma.

Se decidi su RPC, l'unica differenza è che stai specificando esplicitamente il verbo come parte dell'URI, che è chiaro, coerente, meno difettoso e davvero nessun problema. Soprattutto se crei un'app che va ben oltre il semplice CRUD, RPC è l'unica strada da percorrere. Ho un altro problema con i puristi RESTful: HTTP POST, GET, PUT, DELETE hanno significati definiti in HTTP che sono stati sovvertiti da REST nel significato di altre cose, semplicemente perché si adattano la maggior parte del tempo, ma non tutte le volte.

Nella programmazione, ho scoperto da tempo che provare a usare una cosa per significare due cose qualche volta verrà in giro e ti morderà. Mi piace avere la possibilità di utilizzare POST per quasi tutte le azioni, perché offre la libertà di inviare e ricevere dati come il tuo metodo deve fare. Non puoi adattare il mondo intero a CRUD.


30
Questa risposta mostra il malinteso fin troppo normale di cosa sia effettivamente REST. REST non è sicuramente solo una mappatura dei metodi CRUD su HTTP. L'idea che sia un problema "aggiungere un altro metodo" indica chiaramente che REST è frainteso come RPC su HTTP, cosa che non lo è affatto. Prova a leggere il blog di Roy Fieldings o la sua tesi - Google ti aiuterà a trovarlo - non stai descrivendo affatto REST nella tua risposta.
nepdev,

68
Sono una persona molto pratica. Tutte le descrizioni di REST che ho letto iniziano chiaramente con una mappatura dei metodi da CRUD a HTTP. È possibile aggiungere altro in teoria, ma in pratica no. Ad esempio, recentemente ho voluto implementare PATCH per dispositivi Android, ma ho scoperto che Android non consente PATCH, quindi ho usato POST con un'azione esplicitamente definita in tal senso nell'URI. Fondamentalmente, il puro REST non farà i lavori di cui ho bisogno, quindi uso ciò che funziona.
Bruce Patin,

4
Quindi @BrucePatin, nella tua versione "REST" hai un controller con quattro metodi pubblici che mappano da 1 a 1 con GET | PUT | POST | DELETE? Alcuni framework lo fanno ma questo non è REST. I verbi HTTP fanno vaghe asserzioni astratte sulla semantica di una determinata richiesta. Devi mappare i tuoi punti finali in quelle classi in modo appropriato. OTTENERE potrebbe mappare a molti punti finali diversi, così come gli altri. Non esiste infatti alcun motivo per cui non è possibile implementare JSON-RPC su HTTP con REST.
spinkus,

5
C'è un'ottima ragione. Potrei volere diverse dozzine di azioni e ho già incontrato un uso comune (Android) che non supporta nemmeno PATCH. Questo lo uccide freddo. Preferirei essere coerente piuttosto che dover affrontare diverse eccezioni alla regola. In generale, ora userò solo GET, POST e DELETE. PUT non consente il feedback che vorrei su un'operazione di aggiornamento. Sto usando POST per quasi tutto. Per quanto riguarda la memorizzazione nella cache, ha causato molti problemi restituendo vecchi dati. Per quanto riguarda l'inserimento dei parametri in POST, ASP.NET lo gestisce già automaticamente dagli oggetti JSON automatici.
Bruce Patin,

22
Credo che il battibecco su ciò che REST sia realmente sottolinea solo i tuoi commenti e mette in evidenza un'importante carenza di REST. Concettualmente è difficile trovare due persone che sono completamente d'accordo su cosa sia RESTful. In ogni caso, non importa perché nessun servizio dovrebbe essere privo di documenti RPC o REST. Se è documentato, lo sviluppatore che lo utilizza non dovrebbe avere problemi.
Agile Jedi,

29

Innanzitutto, HTTP-REST è un'architettura di "trasferimento rappresentativo dello stato". Ciò implica molte cose interessanti:

  • La tua API sarà senza stato e quindi molto più facile da progettare (è davvero facile dimenticare una transizione in un automa complesso) e integrarsi con parti di software indipendenti.
  • Sarai guidato a progettare metodi di lettura come sicuri , che saranno facili da memorizzare nella cache e da integrare.
  • Sarai guidato a progettare metodi di scrittura come metodi idempotenti , che gestiranno molto meglio i timeout.

Secondo, HTTP-REST è pienamente conforme a HTTP (vedi "sicuro" e "idempotente" nella parte precedente), quindi sarai in grado di riutilizzare le librerie HTTP (esistenti per ogni lingua esistente) e i proxy inversi HTTP, che ti daranno la capacità di implementare funzionalità avanzate (cache, autenticazione, compressione, reindirizzamento, riscrittura, registrazione, ecc.) con zero righe di codice.

Ultimo ma non meno importante, l'utilizzo di HTTP come protocollo RPC è un grosso errore secondo il progettista di HTTP 1.1 (e inventore di REST): http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation. htm # sec_6_5_2


1
+1 per il riferimento autorevole, tipo che dovrebbe sapere .... Dopo ciò è difficile discutere per RPC su HTTP, senza riconoscerlo come un hack / work-around ....
RJB

9
Hai appena fatto riferimento a qualcosa del 2000. È più un argomento filosofico per REST contro RPC. Semanticamente e applicando un modello RPC puoi facilmente considerare l'URI come la "procedura" e i parametri codificati come ... beh ... i parametri. Entrambi i pattern funzionerebbero bene su HTTP. Lo stesso vale per SOAP, RAILS o qualsiasi altro numero di pattern / protocolli che sono stati sovrapposti su HTTP. Non importa finché offri un'API coerente che non violi il contratto.
Agile Jedi,

Aurélien, potresti giustificare, perché REST è più facile da integrare con parti di software indipendenti? Per me, indipendentemente dal fatto che utilizzi l'API RESTful o RPC, il software client deve conoscere il formato di cui parla l'API.
Alexey,

1
@Alexey Questo argomento era relativo all'apolidia. E 'più facile da integrare una macchina da caffè il cui API è CREATE CUP, rispetto ad un altro che dovrebbe contenere INSERT COIN, SELECT COFFEE, SELECT SUGAR, e START. Nella seconda API, poiché dipende dallo stato della macchina, è necessario prestare molta attenzione alla sequenza delle chiamate di procedura.
Aurélien,

1
HTTP come protocollo RPC è REST. Quindi la tua interpretazione errata è sorprendentemente il contrario.
Tiberiu-Ionuț Stan,

24

Grandi risposte - volevo solo chiarire alcuni dei commenti. JSON-RPC è veloce e facile da consumare, ma come detto risorse e parametri sono strettamente accoppiati e tende a fare affidamento sui verbi (api / deleteUser, api / addUser) utilizzando GET / POST dove -come REST fornisce risorse accoppiate liberamente (api / utenti) che in un'API REST HTTP si basano su diversi metodi HTTP (GET, POST, PUT, PATCH, DELETE). REST è leggermente più difficile da implementare per gli sviluppatori inesperti, ma lo stile è diventato un luogo abbastanza comune ora e offre molta più flessibilità a lungo termine (dando alla tua API una vita più lunga).

Oltre a non avere risorse strettamente accoppiate, REST ti consente anche di evitare di impegnarti in un singolo tipo di contenuto, questo significa che se il tuo cliente deve ricevere i dati in XML, o JSON o persino YAML, se integrato nel tuo sistema potresti restituisce uno di quelli che usano le intestazioni content-type / accetta.

Ciò ti consente di mantenere l'API abbastanza flessibile da supportare nuovi tipi di contenuto O requisiti del client.

Ma ciò che veramente separa REST da JSON-RPC è che segue una serie di vincoli attentamente studiati, garantendo flessibilità architettonica. Questi vincoli includono la garanzia che il client e il server siano in grado di evolversi indipendentemente l'uno dall'altro (è possibile apportare modifiche senza incasinare l'applicazione del client), le chiamate sono apolidi (lo stato è rappresentato tramite hypermedia), viene fornita un'interfaccia uniforme per le interazioni, l'API è sviluppata su un sistema a più livelli e la risposta è memorizzabile nella cache dal client. C'è anche un vincolo opzionale per fornire il codice su richiesta.

Tuttavia, con tutto ciò detto, la maggior parte delle API non sono RESTful (secondo Fielding) in quanto non incorporano hypermedia (collegamenti ipertestuali incorporati nella risposta che aiutano a navigare nell'API). La maggior parte delle API scoprirai che sono simili a REST in quanto seguono la maggior parte dei concetti di REST, ma ignorano questo vincolo. Tuttavia, sempre più API lo stanno implementando e sta diventando sempre più una pratica di flusso principale.

Questo ti dà anche una certa flessibilità poiché le API guidate dall'hypermedia (come Stormpath) indirizzano il client agli URI (il che significa che se qualcosa cambia, in alcuni casi puoi modificare l'URI senza impatto negativo), dove -come con gli URI RPC è necessario statico. Con RPC, dovrai anche documentare ampiamente questi diversi URI e spiegare come funzionano l'uno rispetto all'altro.

In generale, direi che REST è la strada da percorrere se vuoi costruire un'API estensibile e flessibile che durerà a lungo. Per questo motivo, direi che è la strada da percorrere per il 99% delle volte.

Buona fortuna, Mike


3
non è LEGGERMENTE più difficile, ma piuttosto estremamente più difficile. Ho cercato di capirlo per circa 4 mesi, e ancora non ho una buona conoscenza di come scrivere un servizio che non si trasforma in un RPC senza stato su http usando json, e non sono ancora convinto c'è una vera differenza tra "REST" e quello che ho appena detto
Austin_Anderson il

19

IMO, il punto chiave è l'azione rispetto all'orientamento delle risorse. REST è orientato alle risorse e si adatta bene alle operazioni CRUD e, data la sua semantica nota, fornisce una certa prevedibilità a un primo utente, ma quando implementato da metodi o procedure ti costringe a fornire una traduzione artificiale al mondo incentrato sulle risorse. D'altra parte RPC si adatta perfettamente alle API orientate all'azione, in cui si espongono servizi, non insiemi di risorse compatibili con CRUD.

Senza dubbio REST è più popolare, questo sicuramente aggiunge alcuni punti se si desidera esporre l'API a terzi.

In caso contrario (ad esempio in caso di creazione di un front-end AJAX in una SPA), la mia scelta è RPC. In particolare JSON-RPC, combinato con JSON Schema come linguaggio di descrizione, e trasportato su HTTP o Websocket a seconda del caso d'uso.

JSON-RPC è una specifica semplice ed elegante che definisce i payload JSON di richiesta e risposta da utilizzare in RPC sincrono o asincrono.

JSON Schema è una bozza di specifica che definisce un formato basato su JSON volto a descrivere i dati JSON. Descrivendo i messaggi di input e output del servizio utilizzando JSON Schema è possibile avere una complessità arbitraria nella struttura dei messaggi senza compromettere l'usabilità e l'integrazione del servizio può essere automatizzata.

La scelta del protocollo di trasporto (HTTP vs websocket) dipende da diversi fattori, essendo il più importante se sono necessarie funzionalità HTTP (memorizzazione nella cache, riconvalida, sicurezza, idempotenza, tipo di contenuto, multipart, ...) o se l'applicazione deve scambiare messaggi ad alto rendimento.

Fino ad ora è la mia opinione personale sulla questione, ma ora qualcosa che può essere davvero utile per quegli sviluppatori Java che leggono queste righe, il framework su cui ho lavorato durante l'ultimo anno, nato dalla stessa domanda che ti stai ponendo ora :

http://rpc.brutusin.org

Puoi vedere una demo live qui, che mostra il browser del repository integrato per i test funzionali (grazie allo schema JSON) e una serie di servizi di esempio:

http://demo.rpc.brutusin.org

Spero che aiuti l'accoppiamento!

Nacho


È bello trovare uno spirito affine! Sto lavorando a qualcosa di simile qui: github.com/dnault/therapi-json-rpc
dnault

:) Ci penserò su
idelvall

1
Sono d'accordo con questo. REST funziona bene per le API CRUD poiché hai l'ovvio POST / GET / PUT / DELETE [PoGPuD? ;)] Mappatura. Tuttavia, se la tua API non si adatta perfettamente a quei verbi, JSON-RPC potrebbe essere una buona opzione poiché i verbi confonderanno semplicemente le cose. Quindi sì, chi lo sta usando e perché è un grande fattore.
Algy Taylor,

1
Esatto - REST è il regno dei nomi, JSON-RPC è verbi.
Rob Grant

16

Se il servizio funziona bene solo con i modelli e il modello GET / POST / PUT / DELETE, utilizzare REST puro.

Sono d'accordo che HTTP è originariamente progettato per applicazioni senza stato.

Ma per le applicazioni moderne, più complesse (!) In tempo reale (web) in cui vorrai usare Websocket (che spesso implicano statualità), perché non usare entrambe? JSON-RPC su Websocket è molto leggero, quindi hai i seguenti vantaggi:

  • Aggiornamenti istantanei su ogni client (definire la propria chiamata RPC da server a client per l'aggiornamento dei modelli)
  • Facile da aggiungere complessità (prova a fare un clone Etherpad con solo REST)
  • Se lo fai nel modo giusto (aggiungi RPC solo come extra per il tempo reale), la maggior parte è ancora utilizzabile con solo REST (tranne se la funzione principale è una chat o qualcosa del genere)

Poiché si sta progettando solo l'API lato server, iniziare con la definizione dei modelli REST e successivamente aggiungere il supporto JSON-RPC in base alle esigenze, mantenendo il numero minimo di chiamate RPC.

(e scusate per l'abuso di parentesi)


15

Sono stato un grande fan di REST in passato e ha molti vantaggi rispetto a RPC su carta. È possibile presentare al client diversi tipi di contenuto, memorizzazione nella cache, riutilizzo dei codici di stato HTTP, guidare il client attraverso l'API e incorporare la documentazione nell'API se non si spiega in gran parte comunque.

Ma la mia esperienza è stata che in pratica questo non regge e invece fai molto lavoro inutile per ottenere tutto nel modo giusto. Inoltre, i codici di stato HTTP spesso non si associano esattamente alla logica del tuo dominio e il loro utilizzo nel tuo contesto spesso sembra un po 'forzato. Ma la cosa peggiore di REST secondo me è che spendi molto tempo per progettare le tue risorse e le interazioni che consentono. E ogni volta che fai alcune importanti aggiunte alla tua API, speri di trovare una buona soluzione per aggiungere le nuove funzionalità e non ti sei già progettato in un angolo.

Questo mi sembra spesso una perdita di tempo perché la maggior parte delle volte ho già un'idea perfettamente chiara e ovvia su come modellare un'API come una serie di chiamate di procedure remote. E se ho fatto tutto questo sforzo per modellare il mio problema all'interno dei vincoli di REST, il problema successivo è come chiamarlo dal client? I nostri programmi si basano su procedure di chiamata, quindi la creazione di una buona libreria client RPC è semplice, la creazione di una buona libreria client REST non è così tanto e nella maggior parte dei casi ti limiterai a mappare dall'API REST sul server a una serie di procedure nel tuo client biblioteca.

Per questo motivo, oggi RPC mi sembra molto più semplice e naturale. Quello che mi manca davvero è un framework coerente che semplifica la scrittura di servizi RPC auto-descrittivi e interoperabili. Pertanto ho creato il mio progetto per sperimentare nuovi modi per rendere RPC più semplice per me e forse anche qualcun altro lo trova utile: https://github.com/aheck/reflectrpc


Dai un'occhiata a OpenRPC, dovrebbe risolvere il tuo bisogno di "servizi RPC facili da scrivere che si descrivono da
soli

11

Secondo il modello di maturità di Richardson , la domanda non è REST vs. RPC , ma quanto REST ?

In questa prospettiva, la conformità allo standard REST può essere classificata in 4 livelli.

  • livello 0: pensare in termini di azioni e parametri. Come spiega l'articolo, questo è essenzialmente equivalente a JSON-RPC (l'articolo lo spiega per XML-RPC, ma gli stessi argomenti valgono per entrambi).
  • livello 1: pensare in termini di risorse. Tutto ciò che è rilevante per una risorsa appartiene allo stesso URL
  • livello 2: utilizzare i verbi HTTP
  • livello 3: HATEOAS

Secondo il creatore dello standard REST, solo i servizi di livello 3 possono essere chiamati RESTful. Tuttavia, questa è una metrica di conformità , non di qualità. Se si desidera semplicemente chiamare una funzione remota che esegue un calcolo, probabilmente non ha senso avere collegamenti hypermedia pertinenti nella risposta, né differenziazione del comportamento basata sul verbo HTTP utilizzato. Quindi, tale chiamata tende intrinsecamente ad essere più simile a RPC. Tuttavia, un livello di conformità inferiore non significa necessariamente statualità o maggiore accoppiamento. Probabilmente, invece di pensare a REST vs. RPC , dovresti usare più REST possibile, ma non di più. Non torcere la tua applicazione solo per adattarla agli standard di conformità RESTful.


1
+1 per i livelli 0, 1 e 2. Tuttavia non ho mai visto un'implementazione di successo di HATEOS, ma ho visto due tentativi miseramente falliti.
mjhm,

8

Perché JSON RPC:

In caso di API REST, dobbiamo definire un controller per ogni funzionalità / metodo di cui potremmo aver bisogno. Di conseguenza, se abbiamo 10 metodi che vogliamo accessibili a un client, dobbiamo scrivere 10 controller per interfacciare la richiesta del client a un metodo particolare.

Un altro fattore è, anche se abbiamo controller diversi per ciascun metodo / funzionalità, il client deve ricordare se utilizzare POST o GET. Questo complica ulteriormente le cose. Inoltre, per inviare i dati, è necessario impostare il tipo di contenuto della richiesta se si utilizza POST.

Nel caso di JSON RPC, le cose sono notevolmente semplificate perché la maggior parte dei server JSONRPC funzionano con metodi POST HTTP e il tipo di contenuto è sempre application / json. Ciò toglie il carico di ricordare di utilizzare il metodo HTTP corretto e le impostazioni del contenuto sul lato client.

Non è necessario creare controller separati per diversi metodi / funzionalità che il server vuole esporre a un client.

Perché RESTO:

Hai URL separati per diverse funzionalità che il server vuole esporre sul lato client. Di conseguenza, puoi incorporare questi URL.

La maggior parte di questi punti sono discutibili e dipendono completamente dal bisogno di una persona.


3

Penso, come sempre, dipende ...

REST ha l'enorme vantaggio di un ampio supporto pubblico e questo significa molti strumenti e libri. Se devi creare un'API utilizzata da un gran numero di consumatori di diverse organizzazioni, è la strada da percorrere per un solo motivo: è popolare. Come protocollo è ovviamente un fallimento totale poiché ci sono troppi modi completamente diversi di associare un comando a un URL / verbo / risposta.

Pertanto, quando scrivi un'app Web a pagina singola che deve parlare con un backend, penso che REST sia troppo complesso. In questa situazione non devi preoccuparti della compatibilità a lungo termine poiché l'app e l'API possono evolversi insieme.

Una volta ho iniziato con REST per un'app Web a pagina singola, ma i comandi precisi tra l'app Web e il server mi hanno fatto impazzire rapidamente. Devo codificarlo come parametro di percorso? Nel corpo? Un parametro di query? Un'intestazione? Dopo aver progettato l'URL / Verb / Response, ho dovuto codificare questo pasticcio in Javascript, il decodificatore in Java e quindi chiamare il metodo effettivo. Sebbene ci siano molti strumenti per farlo, è davvero difficile non ottenere alcuna semantica HTTP nel tuo codice di dominio, il che è davvero una cattiva pratica. (Coesione)

Prova a creare un file Swagger / OpenAPI per un sito medio complesso e confrontalo con una singola interfaccia Java che descriva le procedure remote in quel file. L'aumento della complessità è sbalorditivo.

Sono quindi passato da REST a JSON-RPC per la webapp a pagina singola. aI ho sviluppato una piccola libreria che codificava un'interfaccia Java sul server e la inviava al browser. Nel browser questo ha creato un proxy per il codice dell'applicazione che ha restituito una promessa per ciascuna funzione.

Ancora una volta, REST ha il suo posto solo perché è famoso e quindi ben supportato. È anche importante riconoscere la filosofia delle risorse apolidi e il modello gerarchico sottostanti. Tuttavia, questi principi possono essere altrettanto facilmente utilizzati in un modello RPC. JSON RPC funziona su HTTP, quindi presenta gli stessi vantaggi di REST in quest'area. La differenza è che quando inevitabilmente ti imbatti in queste funzioni che non corrispondono bene a questi principi non sei costretto a fare molto lavoro inutile.


1
Questa risposta mi ha fatto capire le somiglianze tra GraphQL e JSON-RPC e perché GraphQL sta diventando una scelta popolare per le SPA.
Dennis,

OpenRPC è l'equivalente di OpenAPI / Swagger, ma per JSON-RPC
Belfordz,

1

REST è strettamente associato a HTTP, quindi se si espone l'API solo su HTTP, REST è più appropriato per la maggior parte (ma non tutte) le situazioni. Tuttavia, se è necessario esporre l'API su altri trasporti come messaggistica o socket Web, REST non è applicabile.


2
REST è uno stile architettonico e non dipendente dal protocollo.
Mark Cidade,

4
Hai ragione REST è principio architettonico. Tuttavia, la sua base teorica è stata fortemente influenzata dal protocollo HTTP e nonostante la pretesa di applicabilità universale non ha trovato alcuna applicazione pratica oltre al dominio web. Quindi, è sicuro di dire che quando qualcuno menziona REST si riferiscono a servizi web e non al principio architettonico.
dtoux,

1

Sarebbe meglio scegliere JSON-RPC tra REST e JSON-RPC per sviluppare un'API per un'applicazione Web più facile da capire. JSON-RPC è preferito perché la sua mappatura su chiamate e comunicazioni di metodi può essere facilmente compresa.

La scelta dell'approccio più adatto dipende dai vincoli o dall'obiettivo principale. Ad esempio, per quanto riguarda le prestazioni è una caratteristica importante, è consigliabile scegliere JSON-RPC (ad esempio, High Performance Computing). Tuttavia, se l'obiettivo principale è quello di essere agnostici al fine di offrire un'interfaccia generica da dedurre da altri, è consigliabile optare per il REST. Se è necessario raggiungere entrambi gli obiettivi, è consigliabile includere entrambi i protocolli.

Il fatto che divide effettivamente REST da JSON-RPC è che segue una serie di vincoli attentamente pensati che confermano la flessibilità architettonica. I vincoli assumono nel garantire che il client e il server siano in grado di crescere indipendentemente l'uno dall'altro (le modifiche possono essere apportate senza interferire con l'applicazione del client), le chiamate sono apolidi (lo stato è considerato ipermediale), un'uniforme l'interfaccia è offerta per le interazioni, l'API è avanzata su un sistema a strati (Hall, 2010). JSON-RPC è rapido e facile da consumare, tuttavia, poiché le risorse menzionate e i parametri sono strettamente accoppiati e probabilmente dipenderà dai verbi (api / addUser, api / deleteUser) utilizzando GET / POST mentre REST offre risorse vagamente accoppiate (api / utenti) in un HTTP. L'API REST dipende da diversi metodi HTTP come GET, PUT, POST, DELETE, PATCH.

JSON (indicato come JavaScript Object Notation) essendo un formato di interscambio di dati leggero, è facile da leggere e da scrivere per gli umani. È facile per le macchine analizzare e generare. JSON è un formato di testo che è completamente indipendente dalla lingua ma pratica convenzioni che sono familiari ai programmatori della famiglia di lingue, costituite da C #, C, C ++, Java, Perl, JavaScript, Python e numerosi altri. Tali proprietà rendono JSON un linguaggio di scambio dati perfetto e una scelta migliore da optare.


"È una seccatura per le macchine analizzare" - Ho visto un sacco di JSON rotti (ad es. Citazioni senza
escape

1

Domanda sbagliata: impone un manichean che non esiste!

È possibile utilizzare JSON-RPC con "meno verbo" (nessun metodo ) e preservare la standardizzazione minima necessaria per ID sendo, parametri, codici di errore e messaggi di avviso . Lo standard JSON-RPC non dice "non puoi essere REST", ma solo come impacchettare le informazioni di base.

"REST JSON-RPC" esiste ! è REST con "best practice", per un minimo imballaggio delle informazioni, con contratti semplici e solidi.


Esempio

(da questa risposta e contesto didattico)

Quando si ha a che fare con REST, generalmente aiuta iniziare pensando in termini di risorse. In questo caso, la risorsa non è solo "conto bancario" ma è una transazione di quel conto bancario ... Ma JSON-RPC non obbliga il parametro "metodo", tutti sono codificati dal "percorso" dell'endpoint.

  • REST Deposito con POST /Bank/Account/John/Transactionrichiesta JSON {"jsonrpc": "2.0", "id": 12, "params": {"currency":"USD","amount":10}}.
    La risposta JSON può essere qualcosa di simile{"jsonrpc": "2.0", "result": "sucess", "id": 12}

  • REST Prelevare con POST /Bank/Account/John/Transaction... simile.

  • ... GET /Bank/Account/John/Transaction/12345@13... Ciò potrebbe restituire un record JSON di quella transazione esatta (ad esempio, i tuoi utenti in genere desiderano un record di debiti e crediti sul proprio account). Qualcosa come {"jsonrpc": "2.0", "result": {"debits":[...],"credits":[...]}, "id": 13}. La convenzione sulla richiesta (REST) ​​GET può includere la codifica dell'id con "@id", quindi non è necessario inviare alcun JSON, ma comunque utilizzare JSON-RPC nel pacchetto di risposta.



0

Se richiedi risorse, l'API RESTful è migliore in base alla progettazione. Se richiedi alcuni dati complicati con molti parametri e metodi complicati diversi dal semplice CRUD, allora RPC è la strada giusta da percorrere.


Questa è un'enorme semplificazione eccessiva dell'argomento. Perché, in particolare, è "Better by design"? JSON-RPC può essere semplice o complicato quanto vuoi, e quindi l'argomento che sia "migliore" per "molti parametri e metodi complicati" è anche falso. Non è migliore o peggiore in questa materia.
Belfordz

Non importa se RPC utilizza JSON o protobuf o XML per serializzare i dati. Il punto chiave è l'API, come ho detto. Non voglio dire che uno sia migliore dell'altro in tutti i casi. Ma penso che i parametri e i metodi siano importanti quando si sceglie tra le due implementazioni. Se sono semplici, l'API RESTful è ben compresa dalla maggior parte dei programmatori e puoi facilmente costruire la richiesta http. Se sono complicati, RPC è più in grado di esprimere tali API e l'IDE e il compilatore possono aiutarti.
Adrian Liu,

-1

Uso vdata per il protocollo RPC: http://vdata.dekuan.org/

1, PHP e JavaScript sono entrambi a posto. 2, la chiamata di condivisione delle risorse tra le origini (CORS) è ancora a posto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.