{"id":942,"date":"2024-05-20T07:00:42","date_gmt":"2024-05-20T07:00:42","guid":{"rendered":"https:\/\/poyesis.fr\/blogs\/?p=942"},"modified":"2025-02-27T23:21:13","modified_gmt":"2025-02-27T23:21:13","slug":"comprendre-graphql","status":"publish","type":"post","link":"https:\/\/poyesis.fr\/blogs\/comprendre-graphql\/","title":{"rendered":"GraphQL expliqu\u00e9 simplement en 5 minutes"},"content":{"rendered":"\r\n<p>2012.<\/p>\r\n\r\n\r\n\r\n<p>Les statistiques du web mobile commencent \u00e0 exploser.<\/p>\r\n\r\n\r\n\r\n<p>Les entreprises de la tech flairent le filon des applications web responsives design accessibles via les navigateurs web.<\/p>\r\n\r\n\r\n\r\n<p>Parmi elles, Facebook.<\/p>\r\n\r\n\r\n\r\n<p>Sa premi\u00e8re web app pour iOS est cr\u00e9\u00e9e la m\u00eame ann\u00e9e. Sauf que les experts de l\u2019exp\u00e9rience utilisateur du r\u00e9seau social remarquent vite un gros probl\u00e8me : l\u2019interface-utilisateur n\u2019est pas fluide.<\/p>\r\n\r\n\r\n\r\n<p>Les ing\u00e9nieurs de la firme se creusent les m\u00e9ninges\u2026 et d\u00e9cident de cr\u00e9er une application mobile native pour iOS.<\/p>\r\n\r\n\r\n\r\n<p>Et l\u00e0 encore, nouveau probl\u00e8me, leurs APIs REST renvoient trop d\u2019informations et ne sont pas adapt\u00e9es aux sp\u00e9cifications du d\u00e9veloppement mobile.<\/p>\r\n\r\n\r\n\r\n<p>Les APIs REST consomment beaucoup trop de bande passante. Ralentissent la version mobile du r\u00e9seau social. Et surtout, surchargent les serveurs en back-office pour rien.<\/p>\r\n\r\n\r\n\r\n<p>De l\u00e0, vient l\u2019id\u00e9e \u00e0 Lee Byron et \u00e0 deux de ses coll\u00e8gues de cr\u00e9er un nouveau langage de requ\u00eates\u00a0: GraphQL.<\/p>\r\n\r\n\r\n\r\n<p>Publi\u00e9 pour la premi\u00e8re fois en 2012, il devient open-source en 2015, et depuis, il ne cesse de s\u00e9duire les d\u00e9veloppeurs web et mobiles.<\/p>\r\n\r\n\r\n\r\n<p>Et aujourd\u2019hui, on va parler de GraphQL, quels avantages vous pouvez en tirer et comment il fonctionne.<\/p>\r\n\r\n\r\n\r\n<p>Let\u2019s go.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Qu\u2019est-ce que GraphQL\u00a0?<\/h2>\r\n\r\n\r\n\r\n<p>Pour comprendre GraphQL, vous devez savoir ce qu\u2019est une API (si si, c\u2019est important). Une API, ou \u201cApplication Programming interface\u201d, est un ensemble de protocoles qui permettent \u00e0 deux composants logiciels de communiquer.<\/p>\r\n\r\n\r\n\r\n<p>Elles sont \u00e9norm\u00e9ment utilis\u00e9es dans les architectures client-serveur pour permettre \u00e0 l\u2019utilisateur de r\u00e9cup\u00e9rer des donn\u00e9es depuis une base de donn\u00e9es.<\/p>\r\n\r\n\r\n\r\n<p>C\u2019est au concepteur-d\u00e9veloppeur de l\u2019application de choisir et de concevoir l\u2019interface de programmation qui sera utilis\u00e9e.<\/p>\r\n\r\n\r\n\r\n<p>GraphQL, ou Graph Query Language, est un langage de requ\u00eates et un environnement d\u2019ex\u00e9cution c\u00f4t\u00e9 serveur pour API.<\/p>\r\n\r\n\r\n\r\n<p>Sa particularit\u00e9\u00a0? C\u2019est la requ\u00eate du client qui d\u00e9finit la structure des donn\u00e9es qu\u2019il veut.<\/p>\r\n\r\n\r\n\r\n<p>Particularit\u00e9 qui a d\u00e9j\u00e0 s\u00e9duit plusieurs entreprises, dont\u00a0:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>PayPal ;<\/li>\r\n\r\n\r\n\r\n<li>Coursera ;<\/li>\r\n\r\n\r\n\r\n<li>Dailymotion ;<\/li>\r\n\r\n\r\n\r\n<li>GitHub ;<\/li>\r\n\r\n\r\n\r\n<li>Meta.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Vous en trouverez plus en vous rendant sur le site de <a href=\"http:\/\/:%20https:\/landscape.graphql.org\/card-mode?category=graph-ql-adopter&amp;grouping=category\" target=\"_blank\" rel=\"noreferrer noopener\">la fondation GraphQL<\/a> (voici une partie de la liste).<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/lh7-us.googleusercontent.com\/OZNmx55RvxMsiAUODjv-wYdPelaI41dgE9zKVyBJUI0_Pg5RhRAZerRFc7eBD0lQm6cKss0kwpiFCclSjBLRNubgGiAauQ9G-vVCjpTsDR3vGbu_QZrB6ult-nVjENV4sQLAv4FJ0GC5FNgVfFW-aA\" alt=\"Entreprises utilisant les API GraphQL\" width=\"1123\" height=\"501\" \/><\/figure>\r\n\r\n\r\n\r\n<p>Et cette nuance est importante. Car les autres APIs les plus utilis\u00e9es sont les APIs REST (Representational State Transfer).<\/p>\r\n\r\n\r\n\r\n<p>Et elles vous renvoient des informations pr\u00e9d\u00e9finies par le d\u00e9veloppeur qui a con\u00e7u l\u2019architecture serveur. M\u00eame si elles ne correspondent pas aux besoins de l\u2019utilisateur.<\/p>\r\n\r\n\r\n\r\n<p>Parfois, elles envoient trop de donn\u00e9es, et c\u00f4t\u00e9 client, on ne s\u00e9lectionne que celles qui nous int\u00e9ressent. On parle d\u2019over-fetching.<\/p>\r\n\r\n\r\n\r\n<p>Parfois, \u00e0 l\u2019inverse, elles n\u2019envoient pas toutes les informations, ce qui oblige \u00e0 faire plusieurs appels sur la base de donn\u00e9es. On parle d\u2019under-fetching.<\/p>\r\n\r\n\r\n\r\n<p>Ces deux probl\u00e8mes peuvent \u00eatre \u00e9vit\u00e9s gr\u00e2ce \u00e0 une API GraphQL.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Comment fonctionne une API GraphQL\u00a0?<\/h2>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/lh7-us.googleusercontent.com\/FzPXX1wKlijsqtV-zj4NAeClL5v3i4GmkjgQSMK7bNcc60WAfR9vcfTCnRndOyOP3Skss6LfoLwgsae5AvFKjWkNEvV5lrAXzFye8dNAMTuCQSjNTB5sR_-zhWs9nBYA_GU12aZY6U3L\" alt=\"\" width=\"900\" height=\"1600\" \/><\/figure>\r\n\r\n\r\n\r\n<p>Au sein d\u2019une API GraphQL, toutes les requ\u00eates sont des requ\u00eates POST avec, en attribut, une structure de donn\u00e9es.<\/p>\r\n\r\n\r\n\r\n<p>Et c\u2019est la structure de donn\u00e9es pass\u00e9e en param\u00e8tre qui contient les noms des attributs que l\u2019on souhaite recevoir en retour.<\/p>\r\n\r\n\r\n\r\n<p>\u00c0 l\u2019int\u00e9rieur du code de l\u2019API, vous trouverez deux cat\u00e9gories de donn\u00e9es\u00a0:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>les donn\u00e9es \u00ab\u00a0Types\u00a0\u00bb\u00a0;<\/li>\r\n\r\n\r\n\r\n<li>les donn\u00e9es \u00ab\u00a0Champs\u00a0\u00bb.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Et parmi les objets, vous trouverez 3 types d\u2019objets diff\u00e9rents\u00a0:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>les objets \u00ab\u00a0Requ\u00eates\u00a0\u00bb, qui contiennent toutes les requ\u00eates accept\u00e9es par l\u2019API et qui v\u00e9rifient que les formats re\u00e7us sont autoris\u00e9es\u00a0;<\/li>\r\n\r\n\r\n\r\n<li>les objets \u00ab\u00a0mutation\u00a0\u00bb qui d\u00e9finissent toutes les actions possibles et qui permettent de faire des modifications sur les mod\u00e8les d\u00e9finis\u00a0;<\/li>\r\n\r\n\r\n\r\n<li>les objets \u00ab\u00a0abonnement\u00a0\u00bb, qui d\u00e9finissent les mod\u00e8les de la base de donn\u00e9es.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Bon, ok, tout \u00e7a, c\u2019est un peu th\u00e9orique.<\/p>\r\n\r\n\r\n\r\n<p>Alors voici un exemple de code-source.<\/p>\r\n\r\n\r\n\r\n<p>On va d\u00e9finir, en GraphQL, une structure de donn\u00e9es repr\u00e9sentant un concessionnaire automobile (juste son nom et son emplacement). Ensuite, on va r\u00e9cup\u00e9rer son emplacement.<\/p>\r\n\r\n\r\n\r\n<p>Voici ce que \u00e7a donne.<\/p>\r\n\r\n\r\n\r\n<pre>type Concessionnaire {<br \/> \u00a0nom: String<br \/> \u00a0emplacement: String<br \/> \u00a0voitures: String<br \/>}<\/pre>\r\n\r\n\r\n\r\n<p><em>D\u00e9finition du graphe de donn\u00e9es.<\/em><\/p>\r\n\r\n\r\n\r\n<p>Vous voyez \u00e0 quel point c\u2019est simple\u00a0? Let\u2019s go pour un appel en javascript.<\/p>\r\n\r\n\r\n\r\n<pre>const { ApolloClient, InMemoryCache, gql } = require('@apollo\/client');<br \/>\/\/ Remplacez l'URL par l'endpoint de votre serveur GraphQL<br \/><br \/>const graphqlEndpoint = 'https:\/\/votre-serveur-graphql.com\/graphql';<br \/><br \/>\/\/ Initialisez le client Apollo<br \/><br \/>const client = new ApolloClient({<br \/> \u00a0uri: graphqlEndpoint,<br \/> \u00a0cache: new InMemoryCache(),<br \/>});<br \/><br \/>\/\/ D\u00e9finissez votre requ\u00eate GraphQL<br \/>const GET_EMPLACEMENTS = gql`<br \/> \u00a0query {<br \/> \u00a0\u00a0\u00a0concessionnaires {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0emplacement<br \/> \u00a0\u00a0\u00a0}<br \/> \u00a0}<br \/>`;<br \/>\/\/ Effectuez la requ\u00eate<br \/><br \/>client.query({ query: GET_EMPLACEMENTS })<br \/> \u00a0.then(result =&gt; {<br \/> \u00a0\u00a0\u00a0const emplacements = result.data.concessionnaires.map(concessionnaire =&gt; concessionnaire.emplacement);<br \/> \u00a0\u00a0\u00a0console.log('Emplacements des concessionnaires (GraphQL) :', emplacements);<br \/> \u00a0})<br \/> \u00a0.catch(error =&gt; {<br \/> \u00a0\u00a0\u00a0console.error('Erreur lors de la r\u00e9cup\u00e9ration des donn\u00e9es (GraphQL) :', error);<br \/> \u00a0});<\/pre>\r\n\r\n\r\n\r\n<p>Pr\u00eatez bien attention \u00e0 la d\u00e9finition du sch\u00e9ma de requ\u00eate.<\/p>\r\n\r\n\r\n\r\n<pre>const GET_EMPLACEMENTS = gql`<br \/> \u00a0query {<br \/> \u00a0\u00a0\u00a0concessionnaires {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0emplacement<br \/> \u00a0\u00a0\u00a0}<br \/> \u00a0}<br \/>`;<\/pre>\r\n\r\n\r\n\r\n<p>Clairement, on fait comprendre au serveur qu\u2019on ne veut que l\u2019emplacement et rien d\u2019autre.<\/p>\r\n\r\n\r\n\r\n<p>Ainsi, pas besoin de filtrer le r\u00e9sultat qu\u2019il retourne.<\/p>\r\n\r\n\r\n\r\n<p>Si on fait la m\u00eame chose avec une API REST, voici ce que \u00e7a donne\u00a0:<\/p>\r\n\r\n\r\n\r\n<pre>const axios = require('axios');<br \/><br \/>\/\/ Remplacez l'URL par l'endpoint de votre API REST<br \/>const restEndpoint = 'https:\/\/votre-api-rest.com\/concessionnaires';<br \/><br \/>\/\/ Effectuez une requ\u00eate GET pour r\u00e9cup\u00e9rer les donn\u00e9es<br \/>axios.get(restEndpoint)<br \/>.then(response =&gt; {<br \/>const concessionnaires = response.data;<br \/>const emplacements = concessionnaires.map(concessionnaire =&gt; concessionnaire.emplacement);<br \/>console.log('Emplacements des concessionnaires (REST) :', emplacements);<br \/>})<br \/>.catch(error =&gt; {<br \/>console.error('Erreur lors de la r\u00e9cup\u00e9ration des donn\u00e9es (REST) :', error);<br \/>});<\/pre>\r\n\r\n\r\n\r\n<p>Vous voyez la nuance sur les lignes\u00a0:<\/p>\r\n\r\n\r\n\r\n<p>const concessionnaires = response.data;<\/p>\r\n\r\n\r\n\r\n<p>\u00a0\u00a0\u00a0\u00a0const emplacements = concessionnaires.map(concessionnaire =&gt; concessionnaire.emplacement);<\/p>\r\n\r\n\r\n\r\n<p>Ici, on r\u00e9cup\u00e8re toutes les informations des concessionnaires. Et apr\u00e8s \u00e7a, on extrait le champ qui nous int\u00e9resse.<\/p>\r\n\r\n\r\n\r\n<p>Imaginez un peu si on avait plus d\u2019informations sur les concessionnaires\u00a0:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Des images de plusieurs centaines de voitures au format .png ;<\/li>\r\n\r\n\r\n\r\n<li>Des vid\u00e9os de pr\u00e9sentations\u00a0;<\/li>\r\n\r\n\r\n\r\n<li>Des dizaines d\u2019informations textuelles suppl\u00e9mentaires, etc.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Devinez quoi\u00a0? On aurait d\u00fb tout transf\u00e9rer depuis les serveurs avec une API REST pour, au final, ne garder qu\u2019une seule colonne.<\/p>\r\n\r\n\r\n\r\n<p>Bon, c\u2019est un peu exag\u00e9r\u00e9, g\u00e9n\u00e9ralement, on d\u00e9finit une API sp\u00e9cifique qui ne renvoie que des donn\u00e9es pr\u00e9cises pour chaque cas. Mais vous voyez l\u2019id\u00e9e.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Pourquoi GraphQL est (parfois) un meilleur choix qu\u2019une API REST\u00a0?<\/h2>\r\n\r\n\r\n\r\n<p>Quel API choisir pour concevoir vos logiciels\u00a0? \u00c0 quels protocoles allez-vous faire confiance pour le transfert de vos donn\u00e9es\u00a0?<\/p>\r\n\r\n\r\n\r\n<p>Le cabinet Postman a pos\u00e9 la question \u00e0 plusieurs d\u00e9veloppeurs dans le monde. Et voici les r\u00e9sultats qu\u2019ils ont obtenus\u00a0:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/lh7-us.googleusercontent.com\/ff9xSIw3_ZotgmMESB5P8owCrM6kn6Yqvx7f4PtopdJvSvZYtX3rwIbt8TCbGzKpYnVOnlvz3bzMFGq0oKuYHf3DW0SwAf8y1UJf28TEWnWD2e9T893pkIW0fBw1ddKEpf2yCtmQoqntBpIhYsqB1w\" alt=\"Statistiques sur les architectures des API, Postman Report 2023\" width=\"889\" height=\"551\" \/><\/figure>\r\n\r\n\r\n\r\n<p>source : <a href=\"https:\/\/postman.com\/state-of-api\/api-technologies\/#api-technologies\" target=\"_blank\" rel=\"noreferrer noopener\">2023 State of API Report, Postman<\/a><\/p>\r\n\r\n\r\n\r\n<p>Dans les faits, 89 % des devs utilisent des APIs Rest dans leur pile technique contre \u00e0 peine 29 % pour les APIs GraphQL (ils pouvaient choisir plusieurs r\u00e9ponses).<\/p>\r\n\r\n\r\n\r\n<p>Qu\u2019est-ce qui explique ces choix\u00a0?<\/p>\r\n\r\n\r\n\r\n<p>1\u02b3\u1d49 R\u00e9ponse\u00a0: vos besoins applicatifs (<a href=\"https:\/\/poyesis.fr\/blogs\/rediger-cahier-charges\/\" target=\"_blank\" rel=\"noreferrer noopener\">ceux que vous avez list\u00e9s dans votre cahier des charges<\/a>).<\/p>\r\n\r\n\r\n\r\n<p>Et pour \u00eatre s\u00fbr de tirer un maximum d\u2019avantages de GraphQL, <a href=\"https:\/\/poyesis.fr\/blogs\/7-experts-essentiels-a-votre-equipe-de-developpement-dapp-mobile\/\" target=\"_blank\" rel=\"noreferrer noopener\">incluez-la comme crit\u00e8re lorsque vous composez votre \u00e9quipe de d\u00e9veloppeurs<\/a>.<\/p>\r\n\r\n\r\n\r\n<p>\u00a02\u1d49 r\u00e9ponse\u00a0: les avantages et les inconv\u00e9nients de GraphQL.<\/p>\r\n\r\n\r\n\r\n<p>Et justement, voyons-les tout de suite.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">3+1 Avantages de GraphQL<\/h3>\r\n\r\n\r\n\r\n<p>GraphQL a 4 avantages majeurs compar\u00e9 \u00e0 REST.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">1 \u2013 Vous \u00e9vitez l\u2019under-fetching<\/h4>\r\n\r\n\r\n\r\n<p>L\u2019under-fetching se produit lorsqu\u2019une requ\u00eate ne retourne pas toutes les donn\u00e9es dont le programmeur a besoin.<\/p>\r\n\r\n\r\n\r\n<p>En cons\u00e9quence, il doit encore faire un appel serveur et initier un autre transfert de donn\u00e9es pour avoir toutes les informations qu\u2019il veut.\u00a0<\/p>\r\n\r\n\r\n\r\n<p>Vous sentez la d\u00e9gradation des performances de votre app venir\u00a0?<\/p>\r\n\r\n\r\n\r\n<p>Du moins, \u00e7a se passe comme \u00e7a dans une API Rest.<\/p>\r\n\r\n\r\n\r\n<p>Dans une API GraphQL, vous n\u2019avez pas ce probl\u00e8me. Vous demandez des donn\u00e9es, et le serveur vous les retourne, un point c\u2019est tout.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">2 \u2013 Vous \u00e9vitez l\u2019over-fetching<\/h4>\r\n\r\n\r\n\r\n<p>L\u2019over-fetching est l\u2019autre face de l\u2019under-fetching.<\/p>\r\n\r\n\r\n\r\n<p>Il se produit lorsque vous avez besoin d\u2019une information, mais que l\u2019API vous retourne tout un tas d\u2019autres donn\u00e9es dont vous n\u2019avez pas besoin.<\/p>\r\n\r\n\r\n\r\n<p>Sur les APIs REST, c\u2019est fr\u00e9quent.<\/p>\r\n\r\n\r\n\r\n<p>On fait un appel \u00e0 la base de donn\u00e9es via une API dont les champs retours sont d\u00e9j\u00e0 sp\u00e9cifi\u00e9s. Ensuite, apr\u00e8s avoir consomm\u00e9 la bande passante du serveur et du client, on jette tous les champs qui ne nous int\u00e9ressent pas.<\/p>\r\n\r\n\r\n\r\n<p>Du gaspillage pur.<\/p>\r\n\r\n\r\n\r\n<p>Et \u00e7a empire si vous avez besoin de donn\u00e9es sur le m\u00eame serveur, mais accessibles via des API diff\u00e9rentes.<\/p>\r\n\r\n\r\n\r\n<p>Heureusement, avec GraphQL, \u00e7a ne se produit pas.<\/p>\r\n\r\n\r\n\r\n<p>Le d\u00e9veloppeur pr\u00e9cise clairement les champs qu\u2019il attend et le back-end lui fournit uniquement ceux-l\u00e0.<\/p>\r\n\r\n\r\n\r\n<p>Vous vous souvenez de l\u2019extrait de code qu\u2019on vous a fourni plus haut avec le concessionnaire\u00a0? C\u2019est exactement ce qui s\u2019y passe.<\/p>\r\n\r\n\r\n\r\n<p>const concessionnaires = response.data;<\/p>\r\n\r\n\r\n\r\n<p>\u00a0\u00a0\u00a0\u00a0const emplacements = concessionnaires.map(concessionnaire =&gt; concessionnaire.emplacement);<\/p>\r\n\r\n\r\n\r\n<p>Avec l\u2019API Rest, malgr\u00e9 le fait que l\u2019on ne souhaite avoir que l\u2019emplacement, on t\u00e9l\u00e9charge d\u2019abord toutes les donn\u00e9es renvoy\u00e9es par le serveur.<\/p>\r\n\r\n\r\n\r\n<p>L\u2019over-fetching est particuli\u00e8rement \u00e9nervant pour les applications mobiles et web car elle les ralentit fortement.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">3 \u2013 G\u00e9rer les versions n\u2019a jamais \u00e9t\u00e9 aussi simple<\/h4>\r\n\r\n\r\n\r\n<p>Vos applications \u00e9voluent. Les versions se succ\u00e8dent et parfois ne se ressemblent pas.<\/p>\r\n\r\n\r\n\r\n<p>Tr\u00e8s souvent, vous ajouterez ou retirerez des fonctionnalit\u00e9s de l\u2019app.<\/p>\r\n\r\n\r\n\r\n<p>Probl\u00e8me\u00a0: vos \u00e9quipes de dev vont devoir modifier les champs retourn\u00e9s par l\u2019API.<\/p>\r\n\r\n\r\n\r\n<p>Si vous utilisez REST, appr\u00eatez-vous \u00e0 de longues journ\u00e9es \u00e0 chercher exactement quelles fonctions d\u00e9pendent de quelles APIs.<\/p>\r\n\r\n\r\n\r\n<p>Essayez de retirer un champ dans une API alors qu\u2019il est critique pour une fonction utilisant cette API\u2026 et une pluie de bugs informatiques et de crash vont vous tomber dessus.<\/p>\r\n\r\n\r\n\r\n<p>\u00c0 l\u2019inverse, rajoutez trop de champs dans vos APIs pour faire tourner vos nouvelles fonctions, et vos syst\u00e8mes informatiques vont ralentir. Sans compter les risques de vuln\u00e9rabilit\u00e9 accrus aux cyberattaques.<\/p>\r\n\r\n\r\n\r\n<p>(Si vous vous reconnaissez dans l\u2019un de ces cas, <a href=\"https:\/\/poyesis.fr\/contactez-nous\/\" target=\"_blank\" rel=\"noreferrer noopener\">notre chef de projet informatique peut vous aider \u00e0 \u00e9viter que vos applications explosent. Faites-lui un message<\/a>).<\/p>\r\n\r\n\r\n\r\n<p>Bref, la gestion des versions d\u2019un logiciel va vous obliger \u00e0 aller toucher \u00e0 vos APIs et aux requ\u00eates serveurs qui les utilisent.<\/p>\r\n\r\n\r\n\r\n<p>Sauf si vous utilisez GraphQL.<\/p>\r\n\r\n\r\n\r\n<p>Alors non, les APIs GraphQL ne sont pas immuables. Mais elles ont une meilleure r\u00e9trocompatibilit\u00e9, sont plus simples \u00e0 faire \u00e9voluer et \u00e0 adapter \u00e0 vos nouveaux besoins.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">4 \u2013 GraphQL vous facilitent l\u2019acc\u00e8s aux donn\u00e9es \u00e9parpill\u00e9es dans plusieurs bases de donn\u00e9es relationnelles<\/h4>\r\n\r\n\r\n\r\n<p>Voici ce \u00e0 quoi ressemble l\u2019architecture des bases de donn\u00e9es typiques des grands groupes\u00a0:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/lh7-us.googleusercontent.com\/xDKcJ1PXg2MuZstfV2NC4mEE_FyRegiNi7d_GrxdwtbOl_R2C0-hFC9DF1o1-L3aZkDqHKbGCXgkxEuusy7-BT9vru8GvixZKRY5GOYSS3g3j_HdJ8bN0DDasjmloZmAbxsP1qXry9JfRqavb2RhRA\" alt=\"Architecture typique d'une base de donn\u00e9es distribu\u00e9e\" width=\"740\" height=\"511\" \/><\/figure>\r\n\r\n\r\n\r\n<p>Source\u00a0: Oracle https:\/\/docs.oracle.com\/cd\/A58617_01\/server.804\/a58227\/ch21.html<\/p>\r\n\r\n\r\n\r\n<p>Les silos repr\u00e9sentent ici des bases de donn\u00e9es.<\/p>\r\n\r\n\r\n\r\n<p>Vous voyez o\u00f9 je veux en venir\u00a0? Les informations peuvent \u00eatre contenues dans diff\u00e9rents serveurs situ\u00e9s \u00e0 des emplacements g\u00e9ographiques diff\u00e9rents.<\/p>\r\n\r\n\r\n\r\n<p>Et c\u2019est logique\u00a0: si votre entreprise ouvre une branche \u00e0 Paris, vous voudrez tr\u00e8s probablement stocker les informations de vos clients de Paris \u00e0 proximit\u00e9 de Paris. Question de simplifier l\u2019acc\u00e8s aux donn\u00e9es de vos collaborateurs qui g\u00e8rent ces clients.<\/p>\r\n\r\n\r\n\r\n<p>Par contre, vous n\u2019avez pas besoin de dupliquer les informations de votre d\u00e9partement Ressources Humaines sur place. Vous les garderez donc pr\u00e8s de votre si\u00e8ge.<\/p>\r\n\r\n\r\n\r\n<p>Et si, comme tous les GAFAM, vous d\u00e9cidez d\u2019installer votre si\u00e8ge europ\u00e9en \u00e0 Dublin, devinez quoi\u00a0? Vous allez assur\u00e9ment y stocker les informations sur vos ventes, vos finances, etc.<\/p>\r\n\r\n\r\n\r\n<p>Pourquoi je vous parle de \u00e7a\u00a0?<\/p>\r\n\r\n\r\n\r\n<p>Pour vous faire comprendre que vos donn\u00e9es peuvent facilement \u00eatre \u00e9parpill\u00e9es dans des data centers aux 4 coins du monde.<\/p>\r\n\r\n\r\n\r\n<p>Et il n\u2019est pas rare que vous ayez besoin, dans une seule requ\u00eate, d\u2019informations situ\u00e9es dans plusieurs data centers diff\u00e9rents.<\/p>\r\n\r\n\r\n\r\n<p>Vos \u00e9quipes de d\u00e9veloppement vont devoir faire appel \u00e0 plusieurs APIs. Ensuite faire des JOIN\/Merge en SQL entre les cl\u00e9s primaires et secondaires de leurs retours.<\/p>\r\n\r\n\r\n\r\n<p>C\u2019est fastidieux. \u00c7a consomme \u00e9norm\u00e9ment de ressources (\u00e9lectricit\u00e9 + bande passante). Enfin, ce flux de SELECT, JOIN et de MERGE diminuent la dur\u00e9e de vie de votre infrastructure informatique.<\/p>\r\n\r\n\r\n\r\n<p>Pour au final ne r\u00e9cup\u00e9rer que peu d\u2019informations.<\/p>\r\n\r\n\r\n\r\n<p>Avec une couche GraphQL, les performances de telles requ\u00eates vont consid\u00e9rablement s\u2019am\u00e9liorer, car il s\u2019appuie sur des technos web.<\/p>\r\n\r\n\r\n\r\n<p><a href=\"https:\/\/thenewstack.io\/distributed-graph-with-graphql\/\" target=\"_blank\" rel=\"noreferrer noopener\">C\u2019est ce qu\u2019a fait Netflix lors de la cr\u00e9ation de son syst\u00e8me de gestion des publicit\u00e9s Monet<\/a>. En effet, ses pages devaient charger des informations \u00e9parpill\u00e9es sur ses diff\u00e9rents serveurs.<\/p>\r\n\r\n\r\n\r\n<p>Gr\u00e2ce \u00e0 l\u2019ajout d\u2019une couche de GraphQL, les pages qui chargeaient 10 MB de donn\u00e9es n\u2019avaient plus besoin que de 200 KB. Et les performances globales du syst\u00e8me ont fait un boost de x8.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/lh7-us.googleusercontent.com\/xijE39QJBe5bPtoOOLoNl0fob12F58dYXtNfTrDZ-gN1S1CYl08oFxx02AkK7PsqE-pgy-8ItZtpKuo2IyO9YA04SJ1HVCkUzh5CQu1Ti32j1kUH8sewNvNE0RfmeOH3DYr9pT3aavo-\" alt=\"API REST vs API GraphQL\" width=\"1024\" height=\"1024\" \/><\/figure>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Les 4 inconv\u00e9nients majeurs de GraphQL<\/h3>\r\n\r\n\r\n\r\n<p>Apr\u00e8s tout ce qu\u2019on a dit plus haut, on peut \u00eatre tent\u00e9 de se dire que GraphQL est la solution technique \u00e0 tous vos probl\u00e8mes.<\/p>\r\n\r\n\r\n\r\n<p>Attendez.<\/p>\r\n\r\n\r\n\r\n<p>Parce que les API GraphQL ont aussi leurs d\u00e9fauts.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">1 &#8211; Pas de mise en cache c\u00f4t\u00e9 serveur (ou trop complexe)<\/h4>\r\n\r\n\r\n\r\n<p>Avec une API Rest, vous savez exactement quelles informations le client va vous demander.<\/p>\r\n\r\n\r\n\r\n<p>Et si le m\u00eame client demande les m\u00eames informations plusieurs fois, vous pouvez les mettre en cache c\u00f4t\u00e9 serveur pour gagner en vitesse.<\/p>\r\n\r\n\r\n\r\n<p>C\u2019est impossible ou tr\u00e8s peu envisageable avec une API GraphQL.<\/p>\r\n\r\n\r\n\r\n<p>La raison\u00a0: la structure des donn\u00e9es retours n\u2019est pas d\u00e9finie c\u00f4t\u00e9 serveur.<\/p>\r\n\r\n\r\n\r\n<p>Une tactique utilis\u00e9e par les d\u00e9veloppeurs GraphQL est de mettre les informations dans le cache du client. C\u2019est moins efficace, mais \u00e7a marche.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">2 &#8211; La courbe d\u2019apprentissage du langage de requ\u00eate peut \u00eatre abrupte<\/h4>\r\n\r\n\r\n\r\n<p>REST est une norme d\u2019\u00e9changes d\u2019informations cr\u00e9\u00e9e en 2000.<\/p>\r\n\r\n\r\n\r\n<p>\u00c7a fait 24 ans qu\u2019elle est enseign\u00e9e par d\u00e9faut aux geeks et autres passionn\u00e9s d\u2019informatique par d\u00e9faut.<\/p>\r\n\r\n\r\n\r\n<p>Tous ceux qui s\u2019int\u00e9ressent aux codes informatiques et \u00e0 la gestion des donn\u00e9es doivent ma\u00eetriser par c\u0153ur la formule CRUD des API REST. (CRUD = CREATE READ UPDATE DELETE).<\/p>\r\n\r\n\r\n\r\n<p>En cons\u00e9quence, la transition du mod\u00e8le CRUD vers les sch\u00e9mas, r\u00e9solveurs, souscriptions et graphes de GraphQL peut s\u2019av\u00e9rer difficile.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">3 \u2013 Il y a peu de d\u00e9veloppeurs sp\u00e9cialis\u00e9s sur cette technologie (compar\u00e9e aux API REST)<\/h4>\r\n\r\n\r\n\r\n<p>Si vous ne voulez pas, ou n\u2019avez pas le temps de faire une mont\u00e9e en comp\u00e9tence, l\u2019autre solution est d\u2019embaucher un expert ma\u00eetrisant cette technologie.<\/p>\r\n\r\n\r\n\r\n<p>Sauf que, vous vous en doutez, ils sont moins nombreux que ceux ma\u00eetrisant les interfaces de programmation d\u2019applications REST.<\/p>\r\n\r\n\r\n\r\n<p>En \u00e9crivant ces lignes, je suis all\u00e9 faire un tour sur Fiverr, l\u2019une des marketplace de freelance les plus populaires au monde.<\/p>\r\n\r\n\r\n\r\n<p>J\u2019ai fait une recherche sur le terme \u00ab\u00a0D\u00e9veloppeur API GraphQL\u00a0\u00bb et ensuite, j\u2019ai filtr\u00e9 les prestataires parlant fran\u00e7ais et\/ou anglais.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/lh7-us.googleusercontent.com\/dwXF0KyRuir3HQnI4G1Q0q7lUu2MrgOeomsT6RT85DrRNNa-w9RD8vaEMTTIB7gpbRZLa-ndLBfik3lizskMppUjoUB9UfKja3ceT2CRl8GN6Tg21PSioycoSxqPhl8mg8TBL4JyjxUF9WHlym3N_Q\" alt=\"Requ\u00eate &quot;D\u00e9veloppeur GraphQL API&quot; sur Fiverr\" width=\"1460\" height=\"693\" \/><\/figure>\r\n\r\n\r\n\r\n<p>Bilan\u00a0: 1.444 prestataires ( et \u00e0 peine 75 qui parlent au moins le fran\u00e7ais)<\/p>\r\n\r\n\r\n\r\n<p>\u00c0 l\u2019inverse, les d\u00e9veloppeurs d\u2019API REST parlant fran\u00e7ais et\/ou anglais sont\u00a0 15.180\u00a0! (et 656 quand je ne prend que ceux qui parlent fran\u00e7ais).<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/lh7-us.googleusercontent.com\/nhBfEo51mFbs2xOwfL7TT1Zrafe8PMcO2yERt1W3NdiVDva6gM2OG0xaAW4lrZDXSuEBDUxLmmSAdyK2qSJi6uOCZQUA6iN-l1Z3VdFc6lpOOolS_MgNu_J1oKIzZrpfInSQ1e0Hhwlc_ui_s6Vl9A\" alt=\"Requ\u00eate &quot;D\u00e9veloppeur API REST&quot; sur Fiverr\" width=\"1391\" height=\"742\" \/><\/figure>\r\n\r\n\r\n\r\n<p>Je vous laisse faire les calculs vous-m\u00eames pour voir la diff\u00e9rence de taille dans le vivier de talents disponible sur la technologie GraphQL.\u00a0<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">4 \u2013 S\u00e9curiser les serveurs est plus compliqu\u00e9<\/h4>\r\n\r\n\r\n\r\n<p>S\u00e9curiser un serveur utilisant une API GraphQL pr\u00e9sente des d\u00e9fis en termes de cybers\u00e9curit\u00e9 plus importants qu\u2019avec une API REST.<\/p>\r\n\r\n\r\n\r\n<p>La raison\u00a0? les r\u00e9ponses des points terminaux (les clients) ne sont pas statiques comme dans une API REST.<\/p>\r\n\r\n\r\n\r\n<p>Bien s\u00fbr, il y a des moyens pour les s\u00e9curiser, sinon Facebook et tous les autres g\u00e9ants de la tech ne l\u2019utiliseraient pas \ud83d\ude09<\/p>\r\n\r\n\r\n\r\n<p>Et hop, transition parfaite pour le prochain point.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Comment s\u00e9curiser son API GraphQL\u00a0? (4 m\u00e9thodes)<\/h2>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/lh7-us.googleusercontent.com\/R7yN1otafsuIXe9tfBSG-pONRiPZYbbR9b0T0VGVznTAXz8PYvBK_ZFpVTT36MrdtysveH91I_oGExVPeHMsfRZtNmbT--pMAZfdxbPiqlk4MEyiZvFq-sGT-8TWrqeK-MhXcGSxIWdt\" alt=\"\" width=\"500\" height=\"750\" \/>Logo de GraphQ<\/figure>\r\n\r\n\r\n\r\n<p>On est d\u2019accord, GraphQL a ses avantages, si \u00e7a fait de votre syst\u00e8me informatique une passoire pour hacker, hors de question de l\u2019utiliser.<\/p>\r\n\r\n\r\n\r\n<p>Heureusement, il existe une myriade de techniques pour transformer vos API GraphQL en coffres-forts anti-hackers.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">1 \u2013 Restreindre les autorisations<\/h3>\r\n\r\n\r\n\r\n<p>Oui, GraphQL permet \u00e0 l\u2019utilisateur de demander les donn\u00e9es qui l\u2019int\u00e9ressent.<\/p>\r\n\r\n\r\n\r\n<p>Mais encore faut-il qu\u2019il ait l\u2019autorisation de lire tous les champs de donn\u00e9es qu\u2019il demande.<\/p>\r\n\r\n\r\n\r\n<p>Raison pour laquelle, l\u2019un des moyens les plus s\u00fbrs pour diminuer le risque d\u2019attaque informatique est de limiter les autorisations.<\/p>\r\n\r\n\r\n\r\n<p>Coupl\u00e9 \u00e0 une politique d\u2019authentification robuste et le chiffrement des donn\u00e9es et vous \u00eates presque invuln\u00e9rable.<\/p>\r\n\r\n\r\n\r\n<p>Enfin, une autre technique consiste \u00e0 surveiller les activit\u00e9s de l\u2019API pour identifier et neutraliser les menaces. Ainsi, m\u00eame si les identifiants d\u2019un utilisateur sont compromis, vous pourrez rapidement rep\u00e9rer la source de l\u2019attaque et la bloquer.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">2 \u2013 La validation des requ\u00eates de l\u2019API<\/h3>\r\n\r\n\r\n\r\n<p>L\u2019API peut \u00eatre une source d\u2019attaque.<\/p>\r\n\r\n\r\n\r\n<p>Comment\u00a0? Il suffit que l\u2019attaquant demande des informations sensibles ou injecte du code malveillant via un appel-serveur.<\/p>\r\n\r\n\r\n\r\n<p>\u00c9vitez \u00e7a.<\/p>\r\n\r\n\r\n\r\n<p>Pour cela, rien de plus simple\u00a0: pensez \u00e0 toujours v\u00e9rifier les inputs\/outputs de l\u2019API et \u00e0 les nettoyer au besoin.<\/p>\r\n\r\n\r\n\r\n<p>\u00c7a vous \u00e9vitera notamment des attaques par injection.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">3 \u2013 G\u00e9rez la complexit\u00e9 des requ\u00eates avec soin<\/h3>\r\n\r\n\r\n\r\n<p>Vous vous souvenez de ce que l\u2019on disait que GraphQL permet de limiter l\u2019under-fetching en r\u00e9cup\u00e9rant directement toutes les donn\u00e9es\u00a0?<\/p>\r\n\r\n\r\n\r\n<p>\u00c7a aussi, \u00e7a peut \u00eatre une source de vuln\u00e9rabilit\u00e9s informatiques.<\/p>\r\n\r\n\r\n\r\n<p>Si un individu malveillant parvient \u00e0 faire une requ\u00eate profonde, il peut r\u00e9cup\u00e9rer un lot d\u2019informations sensibles. Ou pire, il peut surcharger les serveurs qui h\u00e9bergent vos donn\u00e9es via une attaque par d\u00e9ni de service DDoS.<\/p>\r\n\r\n\r\n\r\n<p>Pour parer \u00e0 \u00e7a, une seule solution\u00a0: limitez la profondeur et l\u2019\u00e9tendue des requ\u00eates.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">4 \u2013 Soyez vigilant sur les demandes d\u2019introspection<\/h3>\r\n\r\n\r\n\r\n<p>L\u2019introspection est une fonctionnalit\u00e9 de GraphQL qui permet au d\u00e9veloppeur de conna\u00eetre le sch\u00e9ma de votre base de donn\u00e9es.\u00a0<\/p>\r\n\r\n\r\n\r\n<p>Elle r\u00e9v\u00e8le absolument tous les champs\u2026 ce qui peut vite devenir probl\u00e9matique si un individu malveillant utilise cette fonction.<\/p>\r\n\r\n\r\n\r\n<p>Raison pour laquelle il est n\u00e9cessaire de toujours restreindre et g\u00e9rer soigneusement les donn\u00e9es expos\u00e9es via les points de terminaison.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Comment faire pour impl\u00e9menter une API GraphQL ou une API REST sur votre projet\u00a0?<\/h2>\r\n\r\n\r\n\r\n<p>Ok.<\/p>\r\n\r\n\r\n\r\n<p>\u00c0 ce stade, vous savez ce qu\u2019est GraphQL (et REST, vu que j\u2019en ai beaucoup parl\u00e9). Et vous voulez savoir si \u00e7a peut booster les performances de votre application web\/mobile ou de votre logiciel.<\/p>\r\n\r\n\r\n\r\n<p>Alors comment faire\u00a0?<\/p>\r\n\r\n\r\n\r\n<p>J\u2019aimerais bien vous donner une r\u00e9ponse type faite A puis B puis C, seulement, votre projet est unique. Et les solutions techniques dont vous avez besoin le sont aussi.<\/p>\r\n\r\n\r\n\r\n<p>Alors, j\u2019ai une autre r\u00e9ponse \u00e0 vous donner\u00a0: <a href=\"https:\/\/poyesis.fr\/contactez-nous\/\">venez en discuter avec notre chef de projet informatique<\/a>.<\/p>\r\n\r\n\r\n\r\n<p>En lui exposant votre projet, il pourra alors mieux vous conseiller et vous dire que faire.<a href=\"https:\/\/poyesis.fr\/contactez-nous\/\">C\u2019est par ici pour le rencontrer<\/a>.<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>2012. Les statistiques du web mobile commencent \u00e0 exploser. Les entreprises de la tech flairent le filon des applications web responsives design accessibles via les navigateurs web. Parmi elles, Facebook. Sa premi\u00e8re web app pour iOS est cr\u00e9\u00e9e la m\u00eame ann\u00e9e. Sauf que les experts de l\u2019exp\u00e9rience utilisateur du r\u00e9seau social remarquent vite un gros [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":947,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jnews-multi-image_gallery":[],"jnews_single_post":{"format":"standard","override":[{"template":"7","single_blog_custom":"553","parallax":"1","fullscreen":"1","layout":"no-sidebar-narrow","sidebar":"default-sidebar","second_sidebar":"default-sidebar","sticky_sidebar":"1","share_position":"floatbottom","share_float_style":"share-normal","show_share_counter":"1","show_view_counter":"1","show_featured":"1","show_post_meta":"1","show_post_author":"1","show_post_author_image":"1","show_post_date":"1","post_date_format":"default","post_date_format_custom":"Y\/m\/d","show_post_category":"1","post_reading_time_wpm":"300","post_calculate_word_method":"str_word_count","show_zoom_button":"0","zoom_button_out_step":"2","zoom_button_in_step":"3","number_popup_post":"1","show_post_related":"1"}],"image_override":[{"single_post_thumbnail_size":"crop-500","single_post_gallery_size":"crop-500"}],"trending_post_position":"meta","trending_post_label":"Trending","sponsored_post_label":"Sponsored by","disable_ad":"0","subtitle":""},"jnews_primary_category":[],"jnews_override_bookmark_settings":{"override_bookmark_button":"0","override_show_bookmark_button":"0"},"jnews_override_counter":{"view_counter_number":"0","share_counter_number":"0","like_counter_number":"0","dislike_counter_number":"0"},"footnotes":""},"categories":[36],"tags":[140,195,109,230,231],"class_list":["post-942","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech","tag-api","tag-application","tag-developpement-mobile","tag-graphql","tag-rest"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/posts\/942","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/comments?post=942"}],"version-history":[{"count":1,"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/posts\/942\/revisions"}],"predecessor-version":[{"id":1183,"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/posts\/942\/revisions\/1183"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/media\/947"}],"wp:attachment":[{"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/media?parent=942"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/categories?post=942"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/poyesis.fr\/blogs\/wp-json\/wp\/v2\/tags?post=942"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}