Tempo di lettura: 4 minuti

Skills Updated: interfaccia client-server

 

COS'È GRAPHQL?

GraphQL è un query language creato da Facebook nel 2012 che fornisce un'interfaccia comune tra client e server per il recupero e la manipolazione dei dati.
 

GraphQL cerca di dare una risposta a diverse esigenze:
- Lato client gli sviluppatori dovrebbero avere un modo per richiedere i dati di cui hanno bisogno;
- Lato server gli sviluppatori dovrebbero poter esporre i dati che hanno;
- ci dovrebbe essere una maniera facile ed efficiente per eseguire query sui dati (le API REST consumano molte risorse specialmente sulle app mobile).

 

COME FUNZIONA GRAPHQL?

Il client chiede i dati al server GraphQL attraverso le query. Il formato della risposta è descritto nella query e definito dal client invece che dal server. La struttura dei dati non è hardcoded come nelle tradizionali API REST e questo permette il recupero dei dati dal server più efficiente per il client.

 

Per esempio un client può chiedere risorse collegate senza bisogno di definire un nuovo endpoint. Con la seguente query GraphQL possiamo chiedere gli specifici campi di un eroe e allo stesso tempo gli amici collegati. 

{
  hero(id: 5) {
    name
    friends {
name }
} }

 

La risposta sarebbe stata questa:

{
 "data" :  {
 "hero" :  {
 "name" :   "R2-D2",  "friends" :  [
{
 }, "name" :   "Luke Skywalker" {
 }, "name" :   "Han Solo" {
 "name" :   "Leia Organa" }
] }
} }


Una richiesta REST invece sarebbe stata tipo:

GET /api/v1 / hero / 1   oppure  GET /api/v1 / hero / 1 / friends

 

PERCHÈ GRAPHQL?

Con GraphQL non abbiamo più la necessità di versionare e mantenere le nostre API REST: possiamo aggiungere e deprecare campi dell’endpoint senza intaccare la funzionalità delle applicazioni già installate, funzionanti e magari non più aggiornabili.
GraphQL è un punto di contratto tra il client e il server: viene definito uno schema che entrambi rispetteranno. Gli oggetti di tale schema devono essere tipizzati per cui non è possibile che ci siano incomprensioni tra team di sviluppo separati: lo schema è unico e comune, inoltre, per ogni campo viene definito il tipo.

type  Hero  { name :   String!
friends :   [ Hero ]! }
***code***
GraphQL permette attraverso l’uso di  fragmets e  di  alias  di  modellare  la nostra richiesta in
maniera  precisa  e  sintetica :
***code***
{
leftComparison :  hero ( episode :  EMPIRE )  {
 ... comparisonFields }
rightComparison :  hero ( episode :  JEDI )  {
 ... comparisonFields }
}
fragment comparisonFields on  Character  { name
  appearsIn
  friends {
name }
}

 

GraphQL è di aiuto quando si ha la necessità di formati di risposta flessibili per evitare ulteriori query e/o quando massicce trasformazioni di dati che comporterebbero overhead per essere mantenuti aggiornati.
L’uso di GraphQL permette al client di cambiare il formato della risposta autonomamente e indipendentemente dal backend.

In GraphQL lo strumento che usiamo per aggiornare i dati dal client al server si chiama mutations:

mutation  CreateReviewForEpisode ( $ep :   Episode !,  $review :   ReviewInput !)  { createReview ( episode :  $ep ,  review :  $review )  {
stars
commentary }
} {

 

Con GraphQL è possibile descrivere i dati e la richiesta degli stessi in maniera più naturale, permettendo quindi di velocizzare lo sviluppo.
Così come il client, allo stesso modo anche il server GraphQL può essere scritto in qualsiasi linguaggio si voglia: PHP, nodejs, Typescript, etc.

 

LE DIFFERENZE CON REST

Le API REST sono basate sulle risorse. Ogni risorsa ha un path univoco per accedervi, un esempio può essere “GET /users/1/friends”, ed è semplice capire così come questo endpoint serva per ottenere tutti gli amici dell’utente con id=1.
Le API REST sono facilmente cachabili al contrario di GraphQL.
Lo svantaggio è che con le API REST è difficile specificare e implementare avanzate tecniche di inclusione o esclusione specialmente con risorse collegate. Questo è esattamente il problema che GraphQL si pone di risolvere.

 

LIMITI DI GRAPHQL

Una delle poche lacune di GraphQL è la mancata possibilità di aggiornare i client in maniera reattiva. Nelle specifiche GraphQL non è presente la funzionalità per fare un “subscribe” e ricevere le notifiche. Si sta procedendo a fare degli esperimenti e vi sono alcune discussioni aperte per implementare tale feature ma, al momento, non abbiamo ancora alcun esempio pratico disponibile.
L’unica modalità per ricevere aggiornamenti real-time è mettersi in polling sul server per ottenere gli update.

 

WHAT'S NEXT?

GraphQL è una brillante tecnologia in rapida diffusione. Rappresenta una nuova via per strutturare la comunicazione tra client e server che faciliti lo sviluppatore lasciandolo libero di concentrarsi sul core dell’app: basta preoccuparsi di saltare da un endpoint ad un altro!

 


E voi cosa ne pensate? Su che progetti la utilizzate? Dateci la vostra opinione!

 


 

RESTA AGGIORNATO, ISCRIVITI ALLA NOSTRA NEWSLETTER

 

 

Andrea Lorenzetti