Anthony Giniers
@antogyn
@aginiers
GraphQL :
Introduction
https://slides.com/antogyn/graphql-intro
GraphQL est un langage de requête pour des données de type graphe
Alternative à REST
Falcor vs GraphQL ?
Adoption : GraphQL grand vainqueur
{
user(id: 123) {
id,
name,
profilePicture(size: SMALL) {
uri
}
}
}
{
"user": {
"id": 123,
"name": "Anthony Giniers",
"profilePicture": {
"uri": "http://xebia.fr/ag50.jpg",
}
}
}
Pour le user d'id "123", on veut :
Une requête GraphQL est une liste hiérarchique de champs
{
user(id: 123) {
id,
name,
profilePicture(size: SMALL) {
uri
}
}
}
{
"user" : {
"id": 123,
"name": "Anthony Giniers",
"profilePicture": {
"uri": "http://xebia.fr/ag50.jpg",
}
}
}
→ Les données ont la même forme que la requête
→ Elles sont accessibles en une seule requête
Je veux récupérer le dernier post de mon dernier ami
{
me {
friends(last: 1) {
posts(last: 1) {
body
}
}
}
}
{
"me": {
"friends": [{
"posts": [{
"body": "poudre 2 perlimpinpin"
}],
}]
}
}
En REST ?
GET /me/friends/posts?last_friends=1&last_posts=1 ??
{
user(id: 123) {
id,
name,
profilePicture(size: SMALL) {
uri
}
}
}
type Query {
user(id: Int): User
}
type User {
id: Int!
name: String
profilePicture(size: Size): Media
}
type Media {
uri: String
}
enum Size {
SMALL
LARGE
}
query {
user(id: 123) {
id,
name,
profilePicture(size: SMALL) {
uri
}
}
}
{
user(id: 123) {
id,
name,
profilePicture(size: SMALL) {
uri
}
}
}
Les spécifications sont encodées dans le client
GraphQL répond aux besoins des vues et des ingénieurs front-end/mobile
{
user(id: 123) {
id,
name,
}
}
type User {
id: Int
name: String @deprecated
identity: Identity
}
type Identity {
name: String
}
{
user(id: 123) {
id,
identity {
name
}
}
}
type User {
id: Int
name: String
}
{
"__schema": {
"types": [
{
"name": "User",
"fields": [
{
"name": "id",
"type": {
"name": "Int"
}
},
{
"name": "name",
"type": {
"name": "String"
}
},
{
"name": "profilePicture",
"type": {
"name": "Media"
}
}
]
}
...
]
}
}
type User {
id: Int
name: String
profilePicture: Media
}
{
__schema {
types {
name
fields {
name
type {
name
}
}
}
}
}
Par exemple :
Questions ?