• GraphQL
  • REST API
  • RESTful API

GraphQL vs. REST API

Esplora le principali differenze tra GraphQL e REST API, i loro vantaggi e quando utilizzare ciascuno per uno sviluppo web ottimale.

Darcy Ye
Darcy Ye
Developer
Simeng
Simeng
Developer

Hai mai lavorato a un progetto di sviluppo di applicazioni web? Se sì, allora potresti già aver incontrato il termine "GraphQL". Ma cosa significa esattamente? Viene utilizzato nelle configurazioni server-side o client-side? Inoltre, quando è preferibile l'integrazione di GraphQL rispetto ad altre alternative? In questo articolo, ti guideremo attraverso queste domande.

Come canale di comunicazione per il trasferimento di dati tra componenti software via internet, le API svolgono un ruolo indispensabile nelle architetture di servizio web moderne, agendo come ossigeno. Tecnologie API come SOAP (un protocollo di messaggistica per servizi web), REST (stile architetturale) e GraphQL (un linguaggio di query e uno strumento) facilitano lo sviluppo software supportando l'integrazione e lo scambio di dati tra diversi servizi, rendendo lo sviluppo più conveniente e flessibile.

Nonostante i numerosi tipi di API, i dibattiti negli ultimi anni si sono prevalentemente concentrati su due paradigmi principali: REST (trasferimento di stato rappresentazionale) e GraphQL. Entrambi offrono una gamma di vantaggi e sono utilizzati globalmente nei progetti web. Tuttavia, differiscono significativamente nel modo in cui gestiscono la comunicazione dei dati.

Cos'è REST API?

REST è uno stile architetturale strutturato sviluppato all'inizio del XXI secolo per costruire applicazioni ipermediali cross-network, progettato per adottare un protocollo di comunicazione senza stato e memorizzabile tra client e server. La REST API (nota anche come RESTful API) è il motore dell'architettura REST.

REST API utilizza identificatori di risorse uniformi (URI) per indirizzare le risorse. REST API funziona utilizzando diversi endpoint per eseguire operazioni CRUD (creare, leggere, aggiornare ed eliminare) sulle risorse di rete. Si basa su formati di dati predefiniti (noti come tipi di media o tipi MIME) per determinare la forma e la dimensione delle risorse fornite ai client. I formati più comuni sono JSON e XML (a volte HTML o testo semplice).

Dopo che il client richiede una risorsa, il server elabora la query e restituisce tutti i dati relativi a quella risorsa. La risposta contiene codici di risposta HTTP come "200 OK" (per una richiesta REST riuscita) e "404 Not Found" (per una risorsa inesistente).

Come funziona REST API?

Le REST API si basano su endpoint predefiniti che espongono risorse su HTTP. Ogni endpoint rappresenta una risorsa, come utenti o post, ed è identificato da un URL univoco. Le operazioni REST sono legate a metodi HTTP standard come GET, POST, PUT e DELETE, che corrispondono a recuperare, creare, aggiornare ed eliminare dati.

Ad esempio, una richiesta a GET /users recupera un elenco completo di utenti, mentre GET /users/123 recupera i dettagli di un utente specifico identificato dal suo ID. Se hai bisogno di accedere anche a dati correlati, come le organizzazioni e i ruoli di organizzazione dell'utente, dovresti fare ulteriori chiamate a GET /users/123/organizations.

REST segue un approccio centrato sulle risorse, focalizzandosi sull'accesso e la manipolazione di risorse discrete.

Cos'è GraphQL?

GraphQL è sia un tipo di API (o linguaggio di query) che un motore runtime per rispondere a quelle query. Offre un'API semplificata ed è particolarmente adatto per applicazioni mobili e l'implementazione di architetture complesse che richiedono sottoinsiemi specifici di dati.

Con GraphQL, gli sviluppatori possono specificare i dati che vogliono recuperare dall'API. Consente anche il recupero dei dati su richiesta invece di recuperare tutto in una volta, applica le modifiche immediatamente e integra fonti di dati di terze parti nell'applicazione.

Le applicazioni possono utilizzare query GraphQL per chiamare servizi GraphQL. Queste query restituiscono esattamente gli elementi di dati richiesti dal client. Questo risparmia multiple chiamate API, larghezza di banda di rete e post-elaborazione. È una soluzione altamente efficiente per le API incentrate sui dati che sono posizionate vicino ai dispositivi di consumo come tablet e telefoni cellulari.

Come funziona GraphQL?

GraphQL, al contrario, adotta un approccio basato su query. Invece di endpoint predefiniti, GraphQL espone un unico endpoint che accetta query strutturate. I client specificano esattamente quali dati necessitano utilizzando un linguaggio di query.

Pertanto, un'implementazione completa di GraphQL deve avere due parti: schema e resolver.

Schema di GraphQL

Gli schemi definiscono i tipi di dati e i loro campi che possono essere recuperati tramite query GraphQL:

Ad esempio, supponiamo di avere il seguente schema:

Un client può interrogare il nome, l'email, le organizzazioni e i ruoli di un utente utilizzando la seguente query:

Questa query non solo recupera solo i campi richiesti (email e organizzazioni), ma anche gli dati correlati (ruoli) in una singola richiesta.

Resolver di GraphQL

Un resolver di GraphQL è un componente chiave in un server GraphQL che determina come recuperare o calcolare i dati richiesti da un client in una query GraphQL. Quando un client invia una query, ogni campo nella query viene abbinato a un resolver, che contiene la logica per recuperare o calcolare i dati per quel campo.

Nell'esempio sopra, i resolver per lo schema avrebbero il seguente aspetto:

Ci sono due tipi di resolver: resolver di root e resolver di campo.

  • Resolver di Root: gestiscono campi di livello superiore nello schema, come Query, Mutation e Subscription.
  • Resolver di Campo: gestiscono campi individuali all'interno di un tipo, spesso per query annidate. Se non viene fornito uno specifico resolver per un campo, GraphQL utilizza il resolver predefinito, che restituisce il valore dall'oggetto padre con il nome del campo corrispondente.

Operazioni di GraphQL

GraphQL supporta tre tipi di operazioni: query, mutation e subscription.

  • Query: utilizzato per LEGGERE dati.
  • Mutation: utilizzato per SCRIVERE dati, comprese le operazioni per aggiungere, modificare ed eliminare dati.
  • Subscription: utilizzato per richiedere una connessione persistente per i dati, consentendo al client di dichiarare i tipi di eventi a cui è interessato e i dati che devono essere restituiti.

Differenze tra GraphQL e REST API

GraphQL e REST API sono strumenti per lo scambio di dati tra diversi servizi web, ma a causa dei loro approcci diversi alla risoluzione dei problemi, ecco le principali differenze tra di loro:

Recupero dati

Le REST API spesso recuperano differenti quantità di dati rispetto a quanto realmente necessario perché gli endpoint restituiscono risposte fisse. GraphQL risolve questo problema permettendo ai clienti di richiedere esattamente ciò di cui hanno bisogno, riducendo il trasferimento di dati non necessari. Questo rende GraphQL ideale per applicazioni con esigenze di dati complesse, come ambienti mobili o a bassa larghezza di banda.

Immagina l'esempio sopra in cui è necessario recuperare i dati statici di un utente, le organizzazioni e i ruoli di organizzazione assegnati all'utente. Con REST API, dovresti effettuare più richieste a diversi endpoint per ottenere tutti i dati. Tuttavia, con GraphQL, puoi recuperare tutti i dati in una singola richiesta.

Flessibilità

La struttura basata sugli endpoint di REST è semplice e funziona bene per applicazioni semplici con operazioni CRUD standard. Questo perché le REST API sono progettate per essere incentrate sulle risorse, con ogni endpoint che rappresenta una specifica risorsa. La principale limitazione di questo approccio è che non consente una rapida iterazione e cambiamenti nei requisiti del cliente. Con ogni modifica apportata al cliente, il server deve essere aggiornato per accogliere i nuovi requisiti, sia aggiungendo nuovi endpoint che aggiornando quelli esistenti. Questo spesso porta a molti endpoint ridondanti e a una gestione complessa delle versioni delle API.

GraphQL, d'altra parte, è più flessibile e consente ai clienti di richiedere solo i dati di cui hanno bisogno. Questa flessibilità è particolarmente utile quando i requisiti del cliente cambiano frequentemente, poiché elimina la necessità di modificare l'implementazione dell'API lato server. I clienti possono richiedere nuovi campi o dati annidati senza richiedere modifiche al server.

Caching

Anche se GraphQL è più efficiente e flessibile in termini di recupero dei dati, ha anche alcuni svantaggi. Uno dei principali problemi è il caching.

La REST API ha un ecosistema maturo. A causa della sua natura senza stato e standardizzata, è facile memorizzare in cache le risposte sia a livello di server che di client. Questo può ridurre significativamente il numero di richieste fatte al server e migliorare le prestazioni.

Tuttavia, a causa della sua flessibilità, molte delle tecnologie di caching disponibili per REST API non sono applicabili a GraphQL. È necessario gestire il caching sul lato client, basato su casi d'uso specifici, il che comporta un carico di lavoro extra per lo sviluppo client.

Pro e Contro

NomeProContro
REST API- Semplice e ampiamente adottata, con estesi strumenti e supporto della comunità.
- Struttura chiara, rendendo facile la comprensione per i principianti.
- Supporto integrato per il caching utilizzando gli standard HTTP.
- Recupero dati eccessivi o insufficienti
- Le modifiche richiedono spesso la creazione di nuove versioni, aumentando il sovraccarico di manutenzione.
GraphQL- Il recupero dati preciso migliora le prestazioni e l'efficienza.
- L'evoluzione dello schema riduce la necessità di versioni.
- Tooling potente, come introspezione e controllo dei tipi, migliora l'esperienza di sviluppo.
- Configurazione più complessa e curva di apprendimento rispetto a REST.
- Richiede soluzioni di caching personalizzate poiché non si basa sul caching HTTP.
- Il design a endpoint singolo può complicare il debug e il monitoraggio.

Conclusione

Sebbene GraphQL abbia guadagnato grande slancio come nuovo arrivato negli ultimi anni, REST API mantiene ancora una notevole importanza per un lungo periodo grazie al suo design atomico e rigore.

REST e GraphQL soddisfano esigenze diverse e eccellono in scenari diversi. La semplicità di REST lo rende una scelta perfetta per applicazioni semplici e microservizi. GraphQL si distingue in scenari che richiedono recupero dati flessibile ed efficiente, in particolare in applicazioni con clienti diversi o relazioni complesse tra dati. La scelta tra i due dipende dai requisiti specifici del tuo progetto, dall'esperienza del team e dalle esigenze di scalabilità a lungo termine.