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
      }
    }
  }
}
Made with Slides.com