Un canarino in una miniera di carbone.
Sto aspettando una domanda come questa da quasi un anno. Era inevitabile che questo giorno arrivasse e sono sicuro che vedremo molte altre domande come questa nei prossimi mesi.
I segnali di avvertimento
Hai assolutamente ragione, ci vuole più tempo per costruire client RESTful che client SOAP. I toolkit SOAP portano via un sacco di codice boilerplate e rendono gli oggetti proxy client disponibili quasi senza sforzo. Con uno strumento come Visual Studio e un URL del server posso accedere a oggetti remoti di complessità arbitraria, localmente in meno di cinque minuti.
I servizi che restituiscono application / xml e application / json sono così fastidiosi per gli sviluppatori client. Che cosa dovremmo fare con quel blocco di dati?
Fortunatamente, molti siti che forniscono servizi REST forniscono anche un gruppo di librerie client in modo da poterle utilizzare per ottenere l'accesso a un gruppo di oggetti fortemente tipizzati. Sembra un po 'stupido però. Se avessero usato SOAP avremmo potuto codificare noi stessi quelle classi proxy.
SOAP in testa, ah. È la latenza che uccide. Se le persone sono davvero preoccupate per il numero di byte in eccesso che attraversano il cavo, forse HTTP non è la scelta giusta. Hai visto quanti byte sono usati dall'intestazione user-agent?
Sì, hai mai provato a utilizzare un browser Web come strumento di debug per qualsiasi cosa diversa da HTML e JavaScript. Fidati di me fa schifo. Puoi usare solo due dei verbi, la memorizzazione nella cache si mette costantemente di mezzo, l'errore nella gestione ingoia così tante informazioni, è costantemente alla ricerca di un dannato favicon.ico. Mi spari e basta.
URL leggibile. Solo sostantivi, nessun verbo. Sì, è facile finché eseguiamo solo operazioni CRUD e dobbiamo solo accedere a una gerarchia di oggetti in un modo. Sfortunatamente la maggior parte delle applicazioni necessita di un po 'più di funzionalità.
Il disastro imminente
Esiste un carico metrico di sviluppatori che attualmente sviluppano applicazioni che si integrano con i servizi REST che stanno arrivando alla stessa serie di conclusioni che hai. Furono promessi semplicità, flessibilità, scalabilità, evolvibilità e il santo graal del riuso fortuito. Le caratteristiche del web stesso, come possono andare le cose male.
Tuttavia, stanno scoprendo che il controllo delle versioni è altrettanto un problema, ma il compilatore non aiuta a rilevare i problemi. Il codice client scritto a mano è un problema da mantenere con l'evoluzione delle strutture di dati e il refactoring degli URL. Progettare API attorno a soli nomi e quattro verbi può essere davvero difficile, specialmente con i fanatici di RESTful Url che ti dicono quando puoi e non puoi usare le stringhe di query.
Gli sviluppatori inizieranno a chiedersi perché stiamo sprecando i nostri sforzi nel supportare sia i formati Json che i formati Xml, perché non concentrare i nostri sforzi su uno solo e farlo bene?
Come sono andate le cose così male?
Ti dirò cosa è andato storto. Come sviluppatori lasciamo che i dipartimenti di marketing traggano vantaggio dalla nostra principale debolezza. La nostra eterna ricerca del proiettile d'argento ci ha accecato alla realtà di ciò che REST è veramente. In apparenza REST sembra così facile e semplice. Assegna un nome alle tue risorse con gli URL e usa GET, PUT, POST e DELETE. Diavolo, noi sviluppatori già sappiamo come farlo, ci occupiamo da anni di database con tabelle e colonne e istruzioni SQL con SELECT, INSERT, UPDATE e DELETE. Avrebbe dovuto essere un gioco da ragazzi.
Ci sono altre parti di REST che alcune persone discutono, come l'auto-descrittività e il vincolo ipermediale, ma questi vincoli non sono così semplici come l'identificazione delle risorse e l'interfaccia uniforme. Sembra aggiungere complessità in cui l'obiettivo desiderato è la semplicità.
Questa versione annacquata di REST è stata convalidata nella cultura degli sviluppatori in molti modi. Sono stati creati framework di server che hanno incoraggiato l'identificazione delle risorse e l'interfaccia uniforme, ma non hanno fatto nulla per supportare gli altri vincoli. I termini hanno iniziato a oscillare differenziando gli approcci, (HI-REST vs LO-REST, Corporate REST vs Academic REST, REST vs RESTful).
Alcune persone gridano che se non si applicano tutti i vincoli non è REST. Non otterrai i benefici. Non c'è mezzo RESTO. Ma quelle voci erano etichettate come fanatici religiosi che erano sconvolti dal fatto che il loro prezioso termine fosse stato rubato dall'oscurità e reso mainstream. Le persone gelose che cercano di far sembrare REST più difficile di quanto non sia.
REST, il termine, è diventato sicuramente mainstream. Quasi tutte le principali proprietà web che dispongono di un'API supportano "REST". Twitter e Netflix sono due di altissimo profilo. La cosa spaventosa è che posso solo pensare a un'API pubblica che è auto-descrittiva e ce ne sono alcune che implementano veramente il vincolo ipermediale. Sicuramente alcuni siti come StackOverflow e Gowalla supportano i collegamenti nelle loro risposte, ma ci sono enormi buchi nei loro collegamenti. L'API StackOverflow non ha una pagina principale. Immagina quanto sarebbe successo il sito Web se non ci fosse una home page per il sito!
Sei stato ingannato, temo
Se sei arrivato così lontano, la risposta breve alla tua domanda è che le API (Netflix e Twitter) non sono conformi a tutti i vincoli e quindi non otterrai i vantaggi che le API REST dovrebbero portare.
I client REST impiegano più tempo a svilupparsi rispetto ai client SOAP ma non sono legati a un servizio specifico, quindi dovresti essere in grado di riutilizzarli tra i servizi. Prendi il classico esempio di un browser web. A quanti servizi può accedere un browser Web? Che dire di un lettore di feed? Ora a quanti servizi diversi può accedere il client Twitter medio? Sì, solo uno.
I client REST non dovrebbero essere creati per interfacciarsi con un singolo servizio, dovrebbero essere creati per gestire tipi di media specifici che potrebbero essere serviti da qualsiasi servizio. La domanda ovvia è: come si può creare un client REST per un servizio che fornisce application / json o application / xml. Beh non puoi. Questo perché quei formati sono completamente inutili per un client REST. L'hai detto tu stesso,
devi fare "ipotesi" su cosa tornerà attraverso la pipe in quanto non esiste uno schema reale o un documento di riferimento
Hai assolutamente ragione per servizi come Twitter. Tuttavia, il vincolo auto-descrittivo in REST afferma che l'intestazione del tipo di contenuto HTTP dovrebbe descrivere esattamente il contenuto che viene trasmesso attraverso il filo. Fornire application / json e application / xml non dice nulla sul contenuto.
Quando si tratta di considerare le prestazioni dei sistemi basati su REST, è necessario guardare al quadro generale. Parlare di byte di inviluppo è come parlare di svolgimento di loop quando si confronta un ordinamento rapido con un ordinamento di shell. Ci sono scenari in cui SOAP può funzionare meglio e ci sono scenari in cui REST può funzionare meglio. Il contesto è tutto.
REST ottiene gran parte del suo vantaggio in termini di prestazioni essendo molto flessibile su quali tipi di supporti supporta e avendo un supporto sofisticato per la memorizzazione nella cache. Affinché la memorizzazione nella cache funzioni correttamente, è necessario rispettare quasi tutti i vincoli.
Il tuo ultimo punto sugli URL leggibili è di gran lunga il più ironico. Se ti impegni davvero con il vincolo ipermediale, ogni URL potrebbe essere un GUID e lo sviluppatore del client non perderebbe nulla in leggibilità.
Il fatto che gli URI debbano essere opachi per il client è una delle cose più importanti nello sviluppo di sistemi REST. Gli URL leggibili sono utili per lo sviluppatore del server e gli URL ben strutturati semplificano l'invio delle richieste da parte del framework del server, ma si tratta di dettagli di implementazione che non dovrebbero avere alcun impatto sugli sviluppatori che utilizzano l'API.
L'API di Twitter non è nemmeno vicina a essere RESTful ed è per questo che non sei in grado di vedere alcun vantaggio nell'usarlo su SOAP. L'API di Netflix è molto più vicina, ma l'uso di tipi di media generici dimostra che il mancato rispetto di un singolo vincolo può avere un impatto profondo sui vantaggi derivati dal servizio.
Potrebbe non essere tutta colpa loro
Ho scaricato molto sui fornitori di servizi, ma ne bastano due per ballare RESTfully. Un servizio può seguire religiosamente tutti i vincoli e un cliente può comunque annullare facilmente tutti i vantaggi.
Se un codice hard client url per accedere a determinati tipi di risorse, impedisce al server di modificare tali URL. Qualsiasi tipo di costruzione di URL basata sulla conoscenza implicita di come il servizio struttura i suoi URL è una violazione.
Fare ipotesi sul tipo di rappresentazione che verrà restituito da un collegamento può portare a problemi. Fare ipotesi sul contenuto della rappresentazione in base a conoscenze che non sono esplicitamente dichiarate nelle intestazioni HTTP creerà sicuramente un accoppiamento che causerà dolore in futuro.
Avrebbero dovuto usare SOAP?
Personalmente, non la penso così. Il REST fatto correttamente consente a un sistema distribuito di evolversi a lungo termine. Se stai costruendo sistemi distribuiti con componenti sviluppati da persone diverse e devono durare per molti anni, REST è un'opzione piuttosto buona.