GraphQL vs REST en PHP : que choisir pour une API en 2024 ?

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : REST ou GraphQL — le combat éternel pour la vitesse et la flexibilité

\n

Bonjour, développeur ! Si tu as déjà écrit une API en PHP, tu as sûrement été confronté au dilemme : utiliser le classique REST ou le moderne GraphQL. Les deux approches résolvent le même problème — la transmission de données entre le client et le serveur — mais le font de manières radicalement différentes.

\n

REST a été pendant des années le standard de facto : simple, compréhensible, prévisible. Mais avec la complexité croissante des fronts (React, Vue, applications mobiles), les développeurs se plaignent de plus en plus du sur-chargement (trop de données dans la réponse) et du sous-chargement (nécessité de faire plusieurs requêtes pour rassembler les informations nécessaires). C'est là que GraphQL entre en scène — un langage de requêtes qui donne au client le contrôle sur les données qu'il reçoit.

\n

Dans cet article, nous ne nous contenterons pas de lister la théorie. Nous prendrons de vrais projets PHP (Laravel et Symfony), écrirons du code et verrons ce qui est plus rapide et ce qui est plus pratique. C'est parti !

\n\n

1. API REST en PHP : un classique qui ne meurt pas

\n

Comment ça fonctionne

\n

REST (Representational State Transfer) est un style architectural où chaque ressource (utilisateur, article, commentaire) a sa propre URL. Le client envoie des requêtes HTTP (GET, POST, PUT, DELETE) et le serveur renvoie une structure de données fixe, généralement en JSON.

\n

Exemple d'un point de terminaison REST typique en PHP (sans framework) :

\n
// index.php - API REST simple\nheader('Content-Type: application/json');\n\n$method = $_SERVER['REQUEST_METHOD'];\n$uri = $_SERVER['REQUEST_URI'];\n\nif ($method === 'GET' && $uri === '/api/users') {\n    $users = [\n        ['id' => 1, 'name' => 'Alexei', 'email' => 'alex@example.com'],\n        ['id' => 2, 'name' => 'Maria', 'email' => 'maria@example.com']\n    ];\n    echo json_encode($users);\n}\n
\n

Avec Laravel, c'est encore plus simple :

\n
// routes/api.php\nRoute::get('/users', function () {\n    return User::all(); // Sérialisé automatiquement en JSON\n});\n
\n

Avantages de REST

\n
    \n
  • Simplicité de mise en cache : le cache HTTP (ETag, Last-Modified) fonctionne nativement.
  • \n
  • Facilité de débogage : n'importe quel navigateur ou curl affiche la réponse.
  • \n
  • Stabilité : REST existe depuis l'an 2000, la documentation et les outils (Postman, Swagger) sont parfaitement rodés.
  • \n
\n

Inconvénients de REST

\n
    \n
  • Sur-chargement : si le client a besoin uniquement du nom de l'utilisateur, il reçoit quand même l'email, le téléphone, l'adresse.
  • \n
  • Problème N+1 : pour obtenir un utilisateur et ses articles, il faut deux requêtes (GET /users/1, GET /users/1/posts).
  • \n
\n\n

2. GraphQL en PHP : quand le client est roi

\n

Comment ça fonctionne

\n

GraphQL n'est pas une base de données, mais une couche entre le client et le serveur. Le client envoie une requête POST à un seul point de terminaison (généralement /graphql) avec un corps de requête décrivant les champs et relations souhaités. Le serveur renvoie exactement ce qui a été demandé — pas un octet de plus.

\n

Exemple d'implémentation en PHP avec la bibliothèque webonyx/graphql-php :

\n
// schema.php\nuse GraphQL\\Type\\Definition\\ObjectType;\nuse GraphQL\\Type\\Definition\\Type;\n\n$userType = new ObjectType([\n    'name' => 'User',\n    'fields' => [\n        'id' => Type::int(),\n        'name' => Type::string(),\n        'email' => Type::string(),\n    ]\n]);\n\n$queryType = new ObjectType([\n    'name' => 'Query',\n    'fields' => [\n        'user' => [\n            'type' => $userType,\n            'args' => ['id' => Type::int()],\n            'resolve' => function ($root, $args) {\n                return findUserById($args['id']); // Votre logique\n            }\n        ]\n    ]\n]);\n
\n

Et maintenant la requête du client :

\n
// Requ                

Blogs

Book Recommendations