GraphQL / Rest (2ème partie)

Dans la 1ère partie nous avons pu voir les principes de base, les différences entre ces 2 technologies ainsi que leur définition. Découvrons aujourd'hui ce qui se passe lorsque l'on appelle une API et abordons le limites de REST et les avantages de GRAPH

Que se passe-t-il lorsque l'on appelle une API ?

Lors de la réception d’une requête par le serveur, le code est ainsi exécuté, il peut s’agir d’un appel d’une autre API, de données provenant d’une base de données ou autre chose.

REST et GraphQL ont tous les deux des méthodes standard afin d’implémenter une API, et il est utile de les comparer pour avoir une idée des différences.

Voici un exemple de code du framework silex :

app.get('/bonjour', function(){
return('Bonjour John Doe!');
})

Voyons le cycle de vie d'une requête HTTP vers un serveur correspondant à une API Rest :

1) Le serveur reçoit la requête et récupère la méthode HTTP (GET dans ce cas).
2) Le code s'exécute une seule fois.
3) On renvoie la réponse au client avec son en-tête correspondant.

 

On reprend le même appel en GraphQL ce qui nous donne :

const resolvers = {
Query: {
bonjour: () => {
return 'Bonjour John Doe!';
},
},
};

Comme nous pouvons le remarquer au lieu d’avoir un code pour une url, nous avons une définition d’un code correspondant à un type en particulier dans le type Query.

C’est ce que nous appelons en GraphQL un résolver.

A l’appel de cette url :

query {
bonjour
}

sera retourné Bonjour John Doe.

Alors, voici ce qui se passe quand notre serveur reçoit une requête de type GraphQL:

1) Le serveur reçoit la requête.
2) La requête est analysée et, pour chaque champ, le code approprié est appelé. Dans notre cas, il n'y a qu'un seul champ, bonjour.
3) Le code est exécuté.
4) La réponse correspondant est renoyée.

On aura donc :

{ "bonjour": "Bonjour John Doe" }

 

Abordons les limites de REST

On associe souvent aux web services le modèle REST. Comme toutes technologies ou architectures, REST ne déroge pas à la règle des défauts.

Voici une petite liste :

  • Aucun typage de données

En allant faire un tour dans la documentation, nous n’avons aucune norme pour les API Rest. Nous avons généralement un retour JSON ou XML. Nous avons ainsi une retour de données non typés et sérialisés.

  • Autant de retour client/serveur pour autant de ressources

L’autre inconvénient est la multitude d’appel client/serveur.

Le modèle REST fonctionne avec le système une URL pour une ressource. Ainsi pour récupérer une liste de contacts, d’adresses, téléphones on aura ainsi donc autant d’appels. On peut facilement atteindre les limites des performances.

  • Une multitude de données par rapport à notre besoin

On est souvent amener à récupérer plus d’infos que nécessaires où une quantité d’informations transite sur le réseau si aucune optimisation n’a été pensée. Mais toute optimisation peut amener facilement à avoir une API des plus complexe.

 

Les avantages de GraphQL

Le cauchemar de chaque utilisateur est la lenteur d’une simple réponse à l’appel d’une API.

Là ou cela est intéressant avec GraphQL, toutes les données peuvent être récupérées en une seule fois.

Voir l’exemple ci-dessous :

 GET /graphql?query={ contact(id: "1") { nom, prenom, adresse { rue, ville }, telephone {indicatif, numero} } }{
"nom": "Doe", 
"prenom": "John",
"adresse": {
"rue": "75000",
"ville": "Paris",
},
"telephone": {
"indicatif": "+33",
"telephone": "345678987",
}
}

Ainsi nous récupérons le contact, l’adresse et le téléphone en une seule requête, ce qui est bien évidemment un gain en performance.

Comme déjà expliqué dans la 1ère partie de cet article, seules les données spécifiées dans la requête sont renvoyées.

 

Il y a un sujet concernant qui ne sera pas abordé mais peut être intéressant à connaître. Il s'agit du système de cache. Je vous invite fortement à aller voir la documentation.

Je vous laisse le soin de décider s’il est pertinent de déjà penser GraphQL au modèle REST.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.