GraphQL e REST API a confronto
Durante la progettazione di un software è importante stabilire i metodi di comunicazione tra il database e l’applicativo. Con particolare attenzione all’integrità dei dati, alla sicurezza e alla robustezza della soluzione. Il modello REST si è ormai consolidato negli anni per offrire un accesso strutturato alle informazioni e molti altri vantaggi. Tuttavia, con la crescente complessità delle applicazioni web ha lasciato spazio alla nascita di nuovi metodi per il trasferimento e la manipolazione di dati. Parliamo del metodo GraphQL.
Una precisazione preliminare
Prima di descrivere le differenze tra GraphQL e REST API è bene definire due paradigmi.
REST API
Una REST API è un'interfaccia di programmazione delle applicazioni conforme ai vincoli dello stile architetturale REST. Quando una richiesta client viene inviata tramite un API REST, questa trasferisce al richiedente o all'endpoint uno stato rappresentativo della risorsa in diversi possibili formati.
GraphQL API
Una GraphQL API è organizzata in termini di tipi e campi, non di endpoint. Tutte le funzionalità dei dati risiedono in un unico endpoint.
GraphQL è un linguaggio di query per le API e un runtime per soddisfare tali query con dati esistenti. È stato creato da Facebook e rilasciato al pubblico come software open-source nel 2015. Fornisce una descrizione completa e comprensibile dei dati nell’ API ed offre alle applicazioni client il potere di richiedere esattamente ciò di cui hanno bisogno e nient'altro.
Un esempio pratico
Per capire meglio il funzionamento immaginiamo una web app che deve mostrare a schermo varie informazioni. Un determinato punto vendita appartenente ad una catena di fast-food, il suo menù e le recensioni dei clienti.
Utilizzando REST API verrà prima eseguita una richiesta ad un endpoint specifico per ottenere in risposta le informazioni associate al punto vendita, es:
/punto-vendita/<id-punto-vendita>
Successivamente si dovrà effettuare un’ulteriore richiesta per ottenere il menù del punto vendita, es:
punto-vendita/<id-punto-vendita>/menu
Infine ancora una richiesta per ottenere le recensioni degli utenti, es:
/punto-vendita/<id-punto-vendita>/reviews
In questo modo possiamo notare alcuni dei problemi delle API REST. Si ha bisogno di effettuare più richieste per ottenere i dati necessari e a volte avviene un over-fetching dei dati, cioè si ricevono più dati del necessario.
Per ampliare quest’ultimo punto immaginiamo che nell’applicazione venga mostrato unicamente il nome del punto vendita e il suo indirizzo. Andando a richiamare però l’endpoint associato ai dettagli del punto vendita si ottengono tutte le informazioni associate ad esso. (Anche quelle non necessarie all’applicazione).
In GraphQL invece si ha la possibilità di effettuare un’unica richiesta che coinvolga multiple risorse e vada a definire i singoli campi di cui abbiamo bisogno. Ad esempio:
{
ristorante(id: "<id-punto-vendita>") {
nome
indirizzo
}
menu(id: "<id-punto-vendita>") {
nome
prezzo
}
}
Le query GraphQL accedono non solo alle proprietà di una risorsa, ma seguono anche agevolmente i riferimenti tra di esse. Mentre le API REST tipiche richiedono il caricamento da più URL, le API GraphQL ottengono tutti i dati necessari in un'unica richiesta. Ciò produce performance migliori anche su connessioni di rete mobile lente.
Ovviamente anche le GraphQL API presentano alcuni svantaggi. Ad esempio il sistema di Caching è decisamente più complesso da implementare. Lo stesso vale per le opzioni di Rate-Limiting, ossia limitare il numero di richieste possibili al giorno.
Differenze nel processo di sviluppo
Uno dei vantaggi principali di GraphQL è la sua flessibilità nel permettere un rapido ciclo di sviluppo. Infatti utilizzando GraphQL sia gli sviluppatori frontend che backend possono lavorare in parallelo senza ostruire il processo di sviluppo. Nel classico approccio REST gli sviluppatori front end dovranno attendere il completamento delle API REST da parte degli sviluppatori backend per poter integrare le richieste all’interno dell’interfaccia.
D’altra parte, REST, grazie alla flessibilità che offre rimane la scelta principale per la maggior parte degli sviluppatori. Ci sono anche altri vantaggi rilevanti. Uno di essi è la possibilità di chiamare e conservare in cache grandi volumi di informazioni. Un altro, la possibilità di creare un’architettura stratificata. In questo modo aumentano le opzioni per un’applicazione modulare che possa scalare rapidamente riducendo il rischio di errore.
Qual è il futuro?
Possiamo dire in conclusione che GraphQL sostituirà il modello REST? Assolutamente no! Entrambi i paradigmi sono validi. Bisogna infatti valutare i loro vantaggi e svantaggi e capire quale soluzione sarà più adatta al caso d’uso. GraphQL è uno strumento molto potente ed in continua crescita ma non una soluzione a tutti i problemi legati allo sviluppo di API!