
GraphQL
The right way for api

Non è un framework
Non è un linguaggio di programmazione

E' una metodologia di query per API
Fornisce una descrizione comprensibile dei dati nelle API.
Dà ai client il potere di chiedere esattamente cosa hanno bisogno.
Creato da FB nel 2012 per migliorare le app native
(prima di allora erano solo WEB-view)
GraphQL

Una query GraphQL è una stringa che viene inviata a un server per essere interpretata e soddisfatta.
Request
Response Json
GraphQL
{
user(id: 4802170) {
id
name
profilePicture(size: 50) {
uri
}
friendConnection(first: 5) {
totalCount
friends {
name
}
}
}
}
{
"data": {
"user": {
"name": "Lee Byron",
"profilePicture": {
"uri": "cdn://pic/4802170/50",
},
"friendConnection": {
"totalCount": 14,
"friends": [
{
"name": "Stephen Schwink"
}
]
}
}
}
}

GraphQL
ASPETTI CHIAVE
- Crea tipizzazione sui dati (Json è notoriamente NON Tipizzato)
- Permette al client di indicare i dati che desidera ricevere
- Utilizza HTTP per la comunicazione ma non implementa REST
- In una sola chiamata si possono unire query differenti
- Il client può recuperare la struttura delle query (es. file WSDL di SOAP)
- Endpoint di richiesta unico


GraphQL
Definisce uno schema
Le query GraphQL rispecchiano la loro risposta.
In questo modo è facile prevedere la forma dei dati restituiti da una query, nonché scrivere una query se si conoscono i dati necessari all'app.
Gerarchico
Segue naturalmente le relazioni tra gli oggetti (Si evitano quindi api apposite per gestire il recupero dati . Questa gerarchia di dati si combina bene con gli archivi di dati strutturati con il grafico e in ultima analisi con le interfacce utente gerarchiche utilizzate all'interno.
Fortemente tipizzato
Ogni query GraphQL corrisponde a un tipo particolare e ogni tipo descrive una serie di campi disponibili.
Simile a SQL, gli consente di fornire messaggi di errore descrittivi prima di eseguire una query.

GraphQL
I TIPI DI DATI
Quando si definisce lo SCHEMA si possono usare tipi di dati semplici e complessi.
Tipi Scalari
boolean
string
int
float
Tipi Complessi
listOf
nonNull
enumeration
Tipi Strutturati
interfaces
union

GraphQL
LO SCHEMA
Lo schema definisce le possibili query che possono essere richiamate dal client.
<?php
use GraphQL\Type\Schema;
$schema = new Schema([
'query' => $queryType, // possibili query eseguibili
'mutation' => $mutationType, // possibile query di update eseguibili
]);

GraphQL
OBJECT TYPE
E' l'oggetto principale.
Descrive query e tipi di dati (entità se paragonate ad un ORM)
<?php
namespace MyApp;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\Examples\Blog\Data\DataSource;
use GraphQL\Examples\Blog\Data\Story;
$userType = new ObjectType([
'name' => 'User',
'description' => 'Our blog visitor',
'fields' => [
'firstName' => [
'type' => Type::string(),
'description' => 'User first name'
],
'email' => Type::string()
]
]);

GraphQL
QUERY Definition
<?php
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'hello' => [
'type' => Type::string(),
'resolve' => function() {
return 'Hello World!';
}
],
'hero' => [
'type' => $characterInterface,
'args' => [
'episode' => [
'type' => $episodeEnum
]
]
]
],
'resolveFields' => function($val, $args, $context, ResolveInfo $info) {
return $this->{$info->fieldName}($val, $args, $context, $info);
}
]);

GraphQL
MUTATION Definition
<?php
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
$mutationType = new ObjectType([
'name' => 'Mutation',
'fields' => [
'createReview' => [
'type' => $createReviewOutput,
'args' => [
'episode' => $episodeEnum,
'review' => $reviewInputObject
],
'resolve' => function($val, $args) {
// ...
}
]
]
]);

GraphQL
QUERY CLIENT
E la query che il client invia per il recupero dei dati.
{
user(id: 4802170) {
id
name
isViewerFriend
profilePicture(size: 50) {
uri
width
height
}
friendConnection(first: 5) {
totalCount
friends {
id
name
}
}
}
}

GRAPHQL in brevissimo
By Saverio M.
GRAPHQL in brevissimo
una velocissima presentazione di GraphQL
- 236