GraphQL vs. REST: quale stile di API, e quando?

Aggiornato: ottobre 2026

REST è uno stile di API con molti endpoint fissi; GraphQL è un linguaggio di query in cui il client chiede a un solo endpoint i campi che gli servono. Il confronto riguarda in realtà chi decide la forma della risposta: in REST l’ha decisa il server in fase di progettazione; in GraphQL la decide il client a ogni richiesta. Tutto il resto – cache, versionamento, errori, prestazioni – discende da quella singola inversione.

Punti chiave

DomandaRisposta
RESTMolti endpoint, risposte definite dal server, cache nativa di HTTP
GraphQLUn endpoint, schema tipizzato, campi e annidamento scelti dal client
La vittoria di GraphQLOverfetching e underfetching muoiono; un’andata e ritorno per schermata
La vittoria di RESTCache CDN, semplicità, supporto universale
La realtà del 2026Coesistenza – REST da ogni parte, GraphQL come livello di aggregazione del frontend

La stessa schermata, nei due modi

Una schermata di profilo ha bisogno di un utente, dei suoi cinque post più recenti e del numero di follower. REST parla per risorse:

GET /users/42               → 38 campi, ne servivano 3   (overfetching)
GET /users/42/posts?limit=5 → secondo giro               (underfetching)
GET /users/42/followers     → terzo giro

GraphQL parla con una sola domanda modellata:

POST /graphql
query {
  user(id: 42) {
    name
    avatarUrl
    posts(first: 5) { title likes }
    followers { totalCount }
  }
}
→ una sola andata e ritorno, esattamente quei campi, nient'altro

Il divario si restringe più di quanto suggeriscano i titoloni: anche un REST ben progettato supporta la selezione dei campi – e i query builder degli SDK la rendono un’abitudine di prima classe:

// JavaScript / Node.js — Back4app JS SDK
// GraphQL's best trick — ask only for what you need — without leaving REST
const query = new Parse.Query('Article');
query.equalTo('status', 'published');
query.select('title', 'views');        // field selection, GraphQL-style
const articles = await query.find();   // lean payload over the REST API
// The same backend also speaks real GraphQL: query { articles { ... } }

GraphQL vs. REST a colpo d’occhio

DimensioneRESTGraphQL
EndpointMolti, a forma di risorseUno solo, a forma di schema
Forma della rispostaDefinita dal serverScelta dal client a ogni query
TipizzazioneConvenzione (OpenAPI facoltativo)Garantita dallo schema, ispezionabile
Andate e ritorniUno per risorsaUno per schermata
CacheNativa HTTP/CDN, indicizzata per URLNormalizzata lato client; persisted query
Versionamento/v1 → /v2Evolvere + deprecare, senza versioni
ErroriCodici di stato HTTP200 + array errors, risultati parziali
Tempo realeA parte (webhook, socket)Subscription nella spec
Curva di apprendimentoMinimaSchema, resolver, controllo dei costi
Primo abbinamento idealeCRUD pubblico, cacheabile, sempliceFrontend multi-client, densi di dati
Flusso di richieste REST multi-endpoint rispetto a GraphQL con endpoint unicoUn client REST esegue tre richieste verso endpoint di risorse separati e assembla il risultato; un client GraphQL invia una sola query a un endpoint unico, che risolve tutti i campi e restituisce una sola risposta modellata.

GraphQL

una query modellata

Client

/graphql
schema + resolver

REST

Client

/users/42

/users/42/posts

/users/42/followers

Un client REST esegue tre richieste verso endpoint di risorse separati e assembla il risultato; un client GraphQL invia una sola query a un endpoint unico, che risolve tutti i campi e restituisce una sola risposta modellata.

Le parti che le pagine di confronto saltano

Il problema N+1 ha cambiato indirizzo, non è morto. Una query GraphQL per post-con-autori fa scattare ingenuamente una chiamata di resolver per ogni post – la stessa patologia N+1 che gli ORM hanno reso celebre, ora lato server. La cura standard è il batching: un loader per richiesta raccoglie gli identificatori degli autori e li recupera con una sola query. Adottare GraphQL senza una strategia di batching significa adottare il peggior bug prestazionale di REST a un nuovo indirizzo.

Gli errori sono una decisione operativa. “200 con un array errors” significa che dashboard, alerting e logica CDN costruiti sui codici di stato diventano ciechi per impostazione predefinita. I team che prosperano con GraphQL trattano l’osservabilità degli errori come parte dell’adozione, non come un pensiero successivo.

Le query senza limiti hanno bisogno di limiti. Un solo endpoint flessibile significa che una singola query può attraversare l’intero grafo – le indicazioni ufficiali di sicurezza parlano di limiti di profondità, budget sul costo delle query e liste di autorizzazione di persisted query per i client interni. Gli endpoint fissi di REST rendevano implicito il controllo dei costi; GraphQL lo lascia in mano a chi sviluppa.

Casi d’uso tipici

  • GraphQL: app mobile su reti lente, dashboard che cuciono insieme molte entità, prodotti con client web + mobile + partner dai bisogni di dati divergenti, iterazione rapida del frontend contro uno schema stabile.
  • REST: API pubbliche per sviluppatori, distribuzione di contenuti cacheabili, superfici di webhook e integrazione, trasferimento di file, chiamate fra servizi dove vince la semplicità.
  • Entrambi (la norma enterprise): REST o RPC fra i servizi di backend; un livello GraphQL che li aggrega per i frontend – il pattern backend-for-frontend con uno schema.

Conviene scegliere GraphQL o REST? Matrice decisionale

Scegliere REST quando…Scegliere GraphQL quando…Usare entrambi quando…
L’API è consumata da parti terzeLe schermate cuciono molte risorseI servizi parlano REST, i frontend vogliono forme
La cache CDN regge il caricoI client hanno bisogni di dati diversiUn’API pubblica e un frontend di prodotto convivono
Le risorse si mappano 1:1 sulle schermateL’overfetching fa soffrire gli utenti mobileSi migra in modo incrementale
Il team rilascia questa settimanaI contratti tipizzati accelerano il lavoro frontendTeam diversi sono proprietari di livelli diversi
Dominano file e webhookLe subscription in tempo reale sono centraliMeglio non riaprire il dibattito

Il punto di partenza onesto: conviene iniziare con REST e aggiungere GraphQL quando il dolore della modellazione dei dati per client eterogenei arriva davvero – e se la piattaforma genera entrambi da un solo schema, la scelta smette di essere architetturale e diventa una decisione per singola richiesta.

Limiti e trade-off

  • REST: over/underfetching sulle schermate dense di dati, migrazioni di versione, deriva della forma delle risposte fra i team e N endpoint di documentazione.
  • GraphQL: la cache richiede meccanismi, il controllo dei costi richiede vigilanza, i resolver richiedono disciplina di batching e il pattern 200-con-errors richiede di rifare l’osservabilità.
  • Entrambi: nessuno dei due ripara un modello di dati sbagliato – un dominio confuso produce un’API confusa in qualunque stile, come la tesi stessa su REST lascia intendere con discrezione: i vincoli hanno sempre riguardato l’architettura sottostante.

GraphQL e REST su Back4app

Back4app è una piattaforma open-source di Backend as a Service (BaaS) che combina database gestito, API REST e GraphQL generate automaticamente, autenticazione, archiviazione di file e funzioni serverless con Cloud Code. Il dilemma di questo articolo si dissolve alla radice: entrambi gli stili di API sono generati dallo stesso schema – endpoint REST cacheabili per URL e un’API GraphQL tipizzata con query annidate – più gli SDK la cui selezione dei campi (le schede di codice qui sopra) consegna il beneficio di punta di GraphQL su entrambi i trasporti. Si sceglie per client, si cambia per schermata, e il livello di API non va scritto affatto.

Domande frequenti

Qual è la differenza principale fra GraphQL e REST?

La forma del contratto. REST espone molti endpoint di risorse, ognuno dei quali restituisce una risposta definita dal server – si prende quello che l'endpoint dà. GraphQL espone un solo endpoint con uno schema tipizzato, e ogni client scrive una query che nomina esattamente i campi e le relazioni annidate che vuole. REST fissa le risposte sul server; GraphQL sposta quella decisione sul client.

GraphQL è più veloce di REST?

Per le schermate che hanno bisogno di dati da più risorse, di solito sì – una query sostituisce diverse andate e ritorni e il payload porta solo i campi richiesti. Per una singola risorsa semplice REST è spesso più rapido, perché le sue risposte indicizzate per URL si mettono in cache magnificamente sulle CDN. E resolver scritti male possono rendere GraphQL più lento di qualsiasi alternativa, per via del problema N+1. Decide il carico di lavoro.

Che cosa sono overfetching e underfetching?

I due dolori di REST per cui GraphQL è stato costruito. Overfetching: un endpoint restituisce l'intera risorsa quando alla schermata servono tre campi. Underfetching: una chiamata non basta, così il client ne fa altre N per i dati collegati. La selezione dei campi e le query annidate affrontano entrambi i problemi – ed è per questo che le app multi-client e dense di dati sono le prime a sentire l'attrazione verso GraphQL.

GraphQL sta sostituendo REST?

No – i dati del settore parlano di coesistenza. I sondaggi mostrano con costanza che la grande maggioranza dei team usa REST, con circa un terzo che adotta GraphQL, nella maggior parte dei casi accanto a REST e non al suo posto. Il pattern enterprise dominante è ibrido: REST (o RPC) fra i servizi e per le API pubbliche, con GraphQL come livello di aggregazione al servizio dei client frontend.

In che modo la cache è diversa fra REST e GraphQL?

Le risposte REST vivono a URL univoci, quindi browser e CDN le mettono in cache a costo zero – il suo superpotere silenzioso. GraphQL invia tipicamente delle POST a un solo endpoint, e questo rompe la cache indicizzata per URL; l'ecosistema compensa con cache normalizzate lato client e persisted query su GET. La cache è l'argomento più forte in favore di REST sulle API pubbliche a forte traffico di lettura.

In che modo il versionamento è diverso?

REST versiona in modo esplicito – una v2 nell'URL o in un header – e tiene in piedi entrambe le versioni durante le migrazioni. GraphQL punta all'evoluzione senza versioni: si aggiungono campi nuovi liberamente, si marcano quelli vecchi come deprecati, si osserva la telemetria di utilizzo e si rimuovono quando i client smettono di chiederli. Funzionano entrambi; GraphQL scambia la cerimonia delle versioni con la disciplina della governance dello schema.

In che modo gli errori sono diversi fra i due?

REST si appoggia ai codici di stato HTTP – un 404 è visibile a ogni proxy, strumento di monitoring e libreria client. GraphQL restituisce di solito un 200 con un array errors accanto a dati parziali: questo abilita il successo parziale, ma impone al monitoring di analizzare i corpi delle risposte invece di fidarsi dei codici di stato. È una differenza operativa reale, non una nota a piè di pagina.

Quando conviene ancora scegliere REST?

Segnali concreti: API pubbliche consumate da molte parti terze, traffico di lettura fortemente cacheabile, CRUD semplice a forma di risorse, upload e download di file, integrazioni in stile webhook e team senza esperienza operativa di GraphQL. REST è il default che tutto supporta; GraphQL è lo specialista che si ingaggia per frontend multi-client e densi di dati.

Termini correlati

Confronta con

Fonti di approfondimento

Pronto a costruire il tuo backend?

Avvia il tuo progetto su Back4app in pochi minuti: database, autenticazione, API e Cloud Code inclusi. Nessuna carta di credito richiesta.

Scritto e revisionato da Back4app Engineering, Back4app Engineering · Pubblicato il 2026-10-05