Formateur GraphQL

Formatez et beautifiez vos requêtes, mutations et schemas GraphQL.

GraphQL Source

Formatage

Options

GraphQL Formaté

Guide complet : GraphQL pour le développement d'APIs modernes

GraphQL : le langage de requête qui a révolutionné les APIs

GraphQL est un langage de requête et un runtime pour APIs développé par Facebook en 2012 et open-sourcé en 2015. Il représente un changement de paradigme par rapport à REST : au lieu d'endpoints multiples retournant des structures fixes, GraphQL offre un endpoint unique où le client spécifie exactement les données qu'il souhaite recevoir.

J'ai adopté GraphQL après des années de frustration avec REST. Le problème classique : votre équipe mobile a besoin de moins de données que le web (bande passante), mais créer des endpoints spécifiques multiplie le travail côté serveur. GraphQL résout ce problème élégamment — chaque client demande ce dont il a besoin, ni plus ni moins.

Les trois opérations fondamentales

📖 Queries (lecture)

Lecture de données. query { user(id: 1) { name email } }. Sélectionnez uniquement les champs nécessaires, traversez les relations en une seule requête.

✏️ Mutations (écriture)

Création, modification, suppression. mutation { createUser(name: "John") { id } }. Retournent les données modifiées pour mettre à jour le cache client.

🔔 Subscriptions (temps réel)

Flux de données en temps réel via WebSocket. subscription { messageAdded { text sender } }. Idéal pour chat, notifications, dashboards live.

🧩 Fragments (réutilisation)

fragment UserFields on User { id name avatar }. Réutilisez des sélections de champs. DRY appliqué aux requêtes, co-localisé avec les composants.

Le système de types GraphQL

GraphQL est fortement typé. Le schema définit toutes les opérations et types disponibles :

  • Scalars : Int, Float, String, Boolean, ID + scalars custom (DateTime, JSON...)
  • Object types : type User { id: ID! name: String! posts: [Post!]! }
  • Input types : Pour les arguments complexes de mutations
  • Enums : enum Status { ACTIVE INACTIVE PENDING }
  • Interfaces & Unions : Polymorphisme (interface Node { id: ID! })

Le ! indique un champ non-nullable. [Type!]! = liste non-null de non-nulls.

Fonctionnalités avancées

  • Variables : query GetUser($id: ID!) { user(id: $id) { name } }. Évitez la concaténation de strings, prévient les injections.
  • Aliases : admin: user(role: ADMIN) { name } moderator: user(role: MOD) { name }. Requêtez le même champ plusieurs fois.
  • Directives : @include(if: $bool), @skip(if: $bool), @deprecated. Contrôle conditionnel.
  • Introspection : Requêtez le schema lui-même. Base de GraphiQL, Apollo Studio, générateurs de types.
  • Persisted queries : Pré-enregistrez les queries pour réduire la taille des requêtes et améliorer la sécurité.

Écosystème et outils

  • Apollo : Client (React, iOS, Android) + Server (Node.js). Le plus populaire.
  • Relay : Client Facebook, optimisé pour React. Plus opinionné, conventions fortes.
  • Hasura / PostGraphile : GraphQL auto-généré depuis PostgreSQL.
  • GraphQL Code Generator : Génère types TypeScript depuis le schema.
  • GraphiQL / Apollo Studio : IDE dans le navigateur pour explorer et tester.

Traitement local : confidentialité garantie

Ce formateur traite vos requêtes GraphQL entièrement dans votre navigateur. Aucune donnée n'est envoyée à un serveur — formatez vos schemas propriétaires en toute confiance.

Questions fréquentes sur GraphQL

GraphQL remplace-t-il REST ?

Non, ce sont des outils complémentaires.

GraphQL excelle pour :

  • Clients multiples avec besoins différents (mobile vs web)
  • Données fortement relationnelles (graphes, réseaux sociaux)
  • Applications temps réel (subscriptions)
  • Équipes frontend qui veulent autonomie sur les données

REST reste pertinent pour :

  • APIs simples avec ressources indépendantes
  • Caching HTTP natif (CDN, proxies)
  • Upload de fichiers (GraphQL supporte mal)
  • Équipes familières avec REST, sans besoin de migration

Beaucoup d'entreprises utilisent les deux : GraphQL pour le frontend, REST pour les intégrations tierces.

Comment fonctionne le caching avec GraphQL ?

Le problème : GraphQL utilise POST sur un endpoint unique. Le caching HTTP (GET + URLs uniques) ne fonctionne pas nativement.

Solutions :

  • Cache client normalisé : Apollo Client et Relay normalisent les données par ID. Une entité mise à jour se répercute partout.
  • Persisted queries + GET : Pré-enregistrez les queries, appelez-les par hash via GET, activez le caching HTTP.
  • CDN avec APQ : Automatic Persisted Queries d'Apollo permettent le caching CDN.
  • Cache serveur : Redis/Memcached avec clés basées sur le hash de la query + variables.

Conseil : Apollo Client gère très bien le cache client. Commencez par là, optimisez le serveur si nécessaire.

Comment sécuriser une API GraphQL ?

Risques spécifiques à GraphQL :

  • Queries trop profondes : { user { friends { friends { friends... } } } } peut surcharger le serveur
  • Introspection exposée : Révèle tout le schema en production
  • Batching abusif : Multiples queries en une requête

Protections :

  • Limite de profondeur : graphql-depth-limit (ex: max 7 niveaux)
  • Complexité de query : graphql-cost-analysis, graphql-query-complexity
  • Rate limiting : Par IP, par user, par query cost
  • Désactiver introspection : En production, ou la restreindre aux admins
  • Persisted queries only : N'accepter que des queries pré-enregistrées

Le problème N+1 existe-t-il en GraphQL ?

Oui, c'est même pire qu'en REST car le client peut demander n'importe quelle profondeur de relations.

Exemple problématique :

{ posts { author { name } } } → 1 query pour les posts + N queries pour chaque auteur.

Solution : DataLoader

  • Librairie Facebook qui batch et cache les requêtes
  • Au lieu de N requêtes SELECT * FROM users WHERE id = ?
  • Une seule requête SELECT * FROM users WHERE id IN (...)

Implémentation : Créez un DataLoader par requête, injectez-le dans le context. C'est la solution standard et indispensable.

Comment gérer les erreurs en GraphQL ?

Particularité GraphQL : HTTP 200 même en cas d'erreur. Les erreurs sont dans le champ errors de la réponse, et vous pouvez avoir des données partielles (certains champs résolus, d'autres en erreur).

Stratégies :

  • Errors array : Par défaut. Bonne pour les erreurs inattendues (serveur down, bug).
  • Result unions : union CreateUserResult = User | ValidationError | NotAuthorized. Le client gère chaque cas explicitement.
  • Extensions : Ajoutez des métadonnées custom dans extensions (codes d'erreur, stack traces en dev).

Recommandation : Result unions pour les erreurs métier prévisibles, errors array pour les erreurs système.

Apollo ou Relay : lequel choisir ?

Apollo Client :

  • Plus facile à apprendre, moins opinionné
  • Fonctionne avec n'importe quel schema GraphQL
  • Documentation abondante, grande communauté
  • Multi-plateforme (React, Vue, Angular, iOS, Android)

Relay :

  • Développé par Facebook, utilisé en production massive
  • Conventions strictes (Connections, Node interface, fragments co-localisés)
  • Compilateur qui optimise les queries au build
  • Meilleur pour les très grandes applications React

Verdict : Débutez avec Apollo. Considérez Relay si votre équipe est prête à adopter ses conventions strictes et que vous avez une grosse application React.

Mes queries GraphQL sont-elles sécurisées avec cet outil ?

Absolument. Tout le formatage s'effectue localement :

  • Le parsing et le formatage sont exécutés en JavaScript dans votre navigateur
  • Aucune requête réseau n'envoie vos queries
  • Votre schema et vos queries ne quittent jamais votre machine
  • L'outil fonctionne même hors ligne après chargement initial

Vérifiez dans l'onglet Network des DevTools : zéro transmission de données. Formatez vos schemas propriétaires en toute confidentialité.