GraphQL, une description pour requête

Alternative à SQL pour accéder au contenu des bases de données en une seule requête.

C'est une interface aux bases de données classiques permettant de lire et modifier le contenu de façon plus intuitive. Son origine vient du besoin de Facebook de réaliser des applications mobiles plus rapides: il fallait obtenir les profils de membres de façon immédiate et plus directe.

Ce langage de requêtes convient plus particulièrement quand le client, usuellement une application mobile ou web, veut accéder à un ensemble de données en une seule requête à la fois, alors que la base est en constante évolution. On décrit une requête sous la forme d'un plan, et on obtient en réponse le contenu correspondant à chaque section du plan...

Sur le plan pratique, une requête ressemble à un objet JavaScript dont seuls les noms des attributs sont indiqués. Le but est d'obtenir la valeur de ces attributs. Elle a une structure hiérarchique: pour billet (post) on a un ensemble de données, et pour chacune, l'auteur par exemple, d'autres données comme le nom et l'avatar.

Exemple de requête:

{
 post {
   title,
   content,
   date,
   author,
   comments {
     author {
       name,
       avatar
     },
     content
   }
 }
} 

L'équivalent SQL nécessiterait d'accéder à plusieurs tables, celle des billets, celle des commentaires, celle des membres inscrits. Il faudrait donc plusieurs requêtes.

On obtient la réponse suivante

 {
  "data" {
    "post": {
      "title": "Grande nouvelle",
      "content": "Voilà ce qui s'est passé..."
      "author": "Emma Kant",
      "comments": [
       {
          "author": {
             "name": "Joe",
             "avatar": "x1"
          },
          "content": "Bien dit"
       },
       {
             ...etc...
       }  
      ]
    }
  }
}

On remarquera que dans la réponse les attributs sont mis entre parenthèses alors que ce n'est pas le cas de la requête. Celle-ci est destinée à un logiciel conçu pour interpréter ce type de structure, alors que la réponse est un objet JSON qui peut être utilisé par n'importe quel logiciel et langage de programmation.

Utiliser GraphQL

Une implémentation a été réalisée en JavaScript qui est offerte en téléchargement sur GitHub, GraphQL.js. C'est un module pour Node.js que l'on installe avec npm.

C'est plutôt un framework qu'un logiciel prêt à recevoir des requêtes, il reste à réaliser son propre serveur de requêtes, ce qui est basique et quand on est familier de Node.js. Le serveur permet d'accéder aux données par HTTP ou avec WebSocket, ou autre protocole. Voici un exemple de serveur Node.js.

La simplicité que l'on a dans la formulation des requêtes se paie par la complexité des schémas qu'il faut définir pour permettre ce type de requête. L'example de Star Wars fourni sur le site de GraphQL nous le montre assez: on a très vite envie de retourner à SQL et ses tables simplement faites de lignes et colonnes!

Cependant pour des bases de données dont la structure est statique et les requètes d'informations multiples fréquentes, cela est la meilleure solution.

L'implémentation des interfaces dans différents langages est un mouvement qui est en marche, avec déjà des implémentations pour les langages utilisés sur serveur comme Java, Go, C#, JavaScript.

Références et outils: