Introduction : pourquoi une API REST en PHP est rapide et simple
\n\nREST (Representational State Transfer) est un style architectural devenu standard pour la création de services web. De nombreux développeurs débutants hésitent à se lancer dans la réalisation d'une API, la considérant comme une tâche complexe. En réalité, écrire une API REST complète en PHP peut se faire en seulement 30 minutes, si l'on suit une structure appropriée.
\n\nDans ce guide, nous allons créer une API simple mais fonctionnelle pour gérer une liste de tâches (To-Do List). Vous apprendrez à gérer les méthodes HTTP (GET, POST, PUT, DELETE), à travailler avec JSON et à mettre en place le routage. Tous les exemples de code sont prêts à être exécutés.
\n\nCe que vous obtiendrez après la lecture :
\n- \n
- Une API REST fonctionnelle en PHP pur sans frameworks \n
- La compréhension des principes de l'architecture RESTful \n
- Une structure prête pour la mise à l'échelle du projet \n
Étape 1 : Configuration de la structure du projet et de la base de données
\n\nPour commencer, créons une structure de dossiers simple. Nous aurons besoin d'un seul fichier PHP pour le routage (index.php) et d'un fichier de configuration de la base de données (config.php).
Structure du projet
\nrest-api-todo/\n│\n├── index.php (routeur principal)\n├── config.php (connexion à la base de données)\n└── .htaccess (configuration des URL propres)\n\nCréation de la base de données MySQL
\nExécutez cette requête SQL dans phpMyAdmin ou via la console :
\nCREATE DATABASE todo_api;\n\nUSE todo_api;\n\nCREATE TABLE tasks (\n id INT AUTO_INCREMENT PRIMARY KEY,\n title VARCHAR(255) NOT NULL,\n completed BOOLEAN DEFAULT FALSE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nINSERT INTO tasks (title) VALUES \n('Apprendre PHP'), \n('Écrire une API REST'), \n('Publier un article');\n\nFichier config.php
\n<?php\n// config.php\nheader('Content-Type: application/json');\nheader('Access-Control-Allow-Origin: *');\nheader('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');\nheader('Access-Control-Allow-Headers: Content-Type');\n\n$host = 'localhost';\n$dbname = 'todo_api';\n$username = 'root';\n$password = '';\n\ntry {\n $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);\n $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n} catch(PDOException $e) {\n echo json_encode(['error' => 'Erreur de connexion à la base de données : ' . $e->getMessage()]);\n exit;\n}\n?>\n\nÉtape 2 : Création d'un point d'entrée unique (routeur)
\n\nDans le fichier index.php, nous implémentons le routage. Il traitera l'URL et redirigera les requêtes vers les fonctions correspondantes.
Fichier index.php (code complet)
\n<?php\nrequire_once 'config.php';\n\n$method = $_SERVER['REQUEST_METHOD'];\n$request = explode('/', trim($_SERVER['PATH_INFO'] ?? '/', '/'));\n\n// Déterminer l'ID de la tâche, s'il est fourni\n$id = isset($request[0]) && is_numeric($request[0]) ? (int)$request[0] : null;\n\n// Gestion des différentes méthodes HTTP\nswitch($method) {\n case 'GET':\n if ($id) {\n getTask($pdo, $id);\n } else {\n getTasks($pdo);\n }\n break;\n \n case 'POST':\n createTask($pdo);\n break;\n \n case 'PUT':\n if ($id) {\n updateTask($pdo, $id);\n } else {\n http_response_code(400);\n echo json_encode(['error' => 'ID de tâche non spécifié']);\n }\n break;\n \n case 'DELETE':\n if ($id) {\n deleteTask($pdo, $id);\n } else {\n http_response_code(400);\n echo json_encode(['error' => 'ID de tâche non spécifié']);\n }\n break;\n \n default:\n http_response_code(405);\n echo json_encode(['error' => 'Méthode non prise en charge']);\n}\n\n// --- Implémentation des fonctions ---\n\nfunction getTasks($pdo) {\n $stmt = $pdo->query("SELECT * FROM tasks ORDER BY created_a