GraphQL pour votre prochain projet ?
En 2020 celà fera 5 ans que ce langage a été rendu publique. Les API sont partout, les sources de données sont multiples et les applications qui les consomment sont complexes. Nombre de développeur/euse contiuent à se creuser la tête pour versionner ces points d'accès aux données, pour les faire évoluer au fil de l'évolution du front.
GraphQL met fin à cette torture mentale et offre aux développeurs back un moyen de laisser les développeurs front interagir avec les données comme ils le souhaitent. Et c'est un fait, c'est stable et documenté donc oui c'est un must have pour tous les projets d'applications et de web apps.
Ci-dessous une explication assez "high level" de ce qu'implique l'utilisation de GraphQL pour un projet de dev.
Salut c'est moi, GraphQL, j'ai 7 ans, je sais lire, écrire et surtout écouter
GraphQL est un langage de requête d'API et un rutime pour exécuter les requêtes. Il a été créé par Facebook en 2012 puis rendu open source sous l'égide de la Linux Foundation en 2015.
Les particularités qui me font dire que ce langage est un must have sur tous les projets d'API et de web apps sont:
- Utilisable côté client comme côté serveur, avec le langage de votre choix et les bases de données ou services de votre choix.
- Le format de la réponse est décrit dans la requête, la structure de donnée n'est pas hard codée, ce qui permet de réduire le nombre de requêtes et la quantité d'informations comparé à une API REST.
- Le langage est très élégant, les requêtes sont typées, il permet de lire, écrire et s'abonner aux changements.
Tu veux être mon ami ? Je suis un peu speed mais je ne dis que des choses intéressantes
Dans la pratique, une API GraphQL se présente comme toute API sous forme de route qui donnent accès aux ressources du serveur.
Prenons l'exemple d'une API qui retourne les données concernant l'utilisateur avec l'ID #1 comme ceci:
GET /users/1
Dans le cas d'une API RESt, cela nous retournerait probablement un JSON qui ressemblerait à ceci, contenant toutes les infos qu'on imagine que le client peut vouloir utiliser
{ id: 1, name: "Johny", email: "johny@caramail.com", info_inutile: "J'aime les fraises", ... }
A noter donc, il y a des infos inutiles et si on désire aussi connaitre la liste des amis de Johny, on va devoir faire un 2e appel:
GET /users/1/friends
A contrario, la requête GraphQL correspondante serait simplement:
{ user(id: 1) { name email friends { name } } }
Ce qui donnerait une réponse comme celle-ci, sans données innutiles et en un seul appel:
{ name: "Johny", email: "johny@caramail.com", friends: [ { name: "Bigoud" }, { name: "Guitare" }, ] }
Dessine moi un mouton, je le transmettrai à ceux que ça intéresse
Comme dit en intro de ce post, GraphQL est indépendant du langage de programmation - client comme serveur, il existe de nombreuses implémentations. De plus il y a un système de type qui vous assure de la validité de ce que vous recevez et de ce que vous répondez.
Le travail du développeur qui crée une API avec GraphQL est de décrire les types et de créer les méthodes qui vont retourner les bons objets en fonction d'une requête "unitaire" ou "générique"
Par exemple si je veux que cette requête:
user(id: "1") { name friends { name } }
Retourne quelque chose comme:
{ data: { user: { name: "Johny", friends: [ { name: "Bigoud" }, { name: "Guitare" }, ], } }
Je dois simplement écrire une fonction "resolve" qui retourne les données d'un user. Avec aussi bien sûr la description du type User qui indique à GraphQL qu'un user a un champs "friends" qui contient d'autres users.
Pour voir le code d'un exemple concret je vous recommande ce repo Github: RisingStack/graphql-server