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 (en cours d'implémentation) 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 aux données en une seule requête à la fois, de façon plus rapide, alors que la base est en constante évolution. Mais il pourrait aussi aider à la créativité: en effet, pour obtenir des données, on décrit une requête sous la forme d'un plan, et on obtient un réponse le contenu correspondant à chaque section du plan...

Pratiquement, 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 la réponse place les textes entre parenthèses et non 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 usuel et relativement aisé avec Node.js. On pourra alors accéder aux données par HTTP ou avec WebSocket, ou autre protocole.

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 nous le montre assez: on a très vite envie de retourner à SQL et ses tables simplement faites de lignes et colonnes!

On en est qu'aux prémisses du format toutefois, qui montrera tout son intérêt lorsqu'on aura implémenté des interfaces dans différents langages. C'est un mouvement qui est en marche, les principaux langages utilisés sur serveur, dont Java, Go, C# ont une implémentation en cours.

Références et outils: