Skip to content
Learni
View all tutorials
Développement Backend

Comment créer une REST API avec Express.js en 2026

Introduction

En 2026, les REST API restent le pilier des applications web modernes, servant de pont entre frontend et backend pour échanger des données au format JSON. Que vous développiez une app mobile, un site e-commerce ou un dashboard, maîtriser la création d'une REST API est essentiel pour tout développeur backend.

Ce tutoriel beginner vous guide pas à pas pour construire une REST API complète gérant un CRUD (Create, Read, Update, Delete) sur une liste de tâches (todos), stockée en mémoire pour simplicité. Nous utilisons Node.js et Express.js, le duo incontournable pour sa légèreté et sa maturité.

Pourquoi c'est crucial ? Une bonne API respecte les conventions REST (HTTP methods, status codes, ressources), est scalable et sécurisée. À la fin, vous aurez un serveur fonctionnel testable avec des outils comme Postman ou curl. Temps estimé : 30 minutes. Prêt à coder ? (128 mots)

Prérequis

  • Node.js 20+ installé (téléchargez-le ici)
  • Connaissances de base en JavaScript (variables, fonctions, tableaux)
  • Un éditeur de code comme VS Code
  • Outils de test : curl (terminal) ou Postman
  • Terminal/Command Prompt

Initialiser le projet

terminal
mkdir rest-api-todos
cd rest-api-todos
npm init -y
npm install express
npm install --save-dev nodemon

Ces commandes créent un dossier projet, initialisent npm avec un package.json par défaut, installent Express pour le serveur HTTP et Nodemon pour redémarrer automatiquement le serveur en dev. Exécutez-les dans votre terminal pour un setup prêt en 1 minute. Évitez d'oublier Nodemon : sans lui, chaque changement nécessite un redémarrage manuel.

Comprendre la structure du projet

Votre dossier contient maintenant package.json, node_modules et un scripts pour lancer npm run dev avec Nodemon. Nous allons créer un fichier server.js unique pour tout le serveur – simple pour débutants. Chaque étape suivante met à jour ce fichier avec du code complet et fonctionnel. Testez toujours avec node server.js ou npm run dev.

Serveur de base avec route de santé

server.js
const express = require('express');
const app = express();
const PORT = 3000;

app.use(express.json());

app.get('/health', (req, res) => {
  res.json({ status: 'OK', message: 'Serveur REST API opérationnel' });
});

app.listen(PORT, () => {
  console.log(`Serveur démarré sur http://localhost:${PORT}`);
});

Ce code crée un serveur Express écoutant sur le port 3000, parse les JSON entrants et expose une route GET /health pour vérifier le statut. Le middleware express.json() est crucial pour les bodies JSON. Testez avec curl http://localhost:3000/health. Piège : sans app.use(express.json()), les POST échouent silencieusement.

Ajouter les données et route GET /todos

server.js
const express = require('express');
const app = express();
const PORT = 3000;

app.use(express.json());

let todos = [
  { id: 1, title: 'Apprendre REST API', completed: false },
  { id: 2, title: 'Coder une todo app', completed: true }
];

app.get('/health', (req, res) => {
  res.json({ status: 'OK', message: 'Serveur REST API opérationnel' });
});

app.get('/todos', (req, res) => {
  res.json(todos);
});

app.listen(PORT, () => {
  console.log(`Serveur démarré sur http://localhost:${PORT}`);
});

Nous ajoutons un tableau todos en mémoire (idéal pour proto) et une route GET /todos renvoyant toutes les tâches. Respecte REST : GET pour lire une collection. Testez curl http://localhost:3000/todos. Analogie : comme un catalogue en ligne. Évitez les variables globales en prod ; ici, c'est pour simplicité.

Implémenter le CREATE (POST)

Prochaine étape : POST /todos. Nous validons l'input (title requis) et générons un ID unique avec la longueur du tableau +1. Status 201 pour création réussie.

Route POST /todos pour créer une todo

server.js
const express = require('express');
const app = express();
const PORT = 3000;

app.use(express.json());

let todos = [
  { id: 1, title: 'Apprendre REST API', completed: false },
  { id: 2, title: 'Coder une todo app', completed: true }
];

app.get('/health', (req, res) => {
  res.json({ status: 'OK', message: 'Serveur REST API opérationnel' });
});

app.get('/todos', (req, res) => {
  res.json(todos);
});

app.post('/todos', (req, res) => {
  const { title } = req.body;
  if (!title || title.trim() === '') {
    return res.status(400).json({ error: 'Le titre est requis' });
  }
  const newTodo = {
    id: todos.length + 1,
    title: title.trim(),
    completed: false
  };
  todos.push(newTodo);
  res.status(201).json(newTodo);
});

app.listen(PORT, () => {
  console.log(`Serveur démarré sur http://localhost:${PORT}`);
});

La route POST valide le body, ajoute une todo et renvoie l'objet créé avec 201. Utilisez curl -X POST -H 'Content-Type: application/json' -d '{"title":"Nouvelle tâche"}' http://localhost:3000/todos. Piège : sans validation, des données sales polluent votre API. L'ID incrémental suffit pour demo ; en prod, utilisez UUID.

Routes READ/UPDATE/DELETE par ID

server.js
const express = require('express');
const app = express();
const PORT = 3000;

app.use(express.json());

let todos = [
  { id: 1, title: 'Apprendre REST API', completed: false },
  { id: 2, title: 'Coder une todo app', completed: true }
];

app.get('/health', (req, res) => {
  res.json({ status: 'OK', message: 'Serveur REST API opérationnel' });
});

app.get('/todos', (req, res) => {
  res.json(todos);
});

app.post('/todos', (req, res) => {
  const { title } = req.body;
  if (!title || title.trim() === '') {
    return res.status(400).json({ error: 'Le titre est requis' });
  }
  const newTodo = {
    id: todos.length + 1,
    title: title.trim(),
    completed: false
  };
  todos.push(newTodo);
  res.status(201).json(newTodo);
});

app.get('/todos/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const todo = todos.find(t => t.id === id);
  if (!todo) {
    return res.status(404).json({ error: 'Todo non trouvée' });
  }
  res.json(todo);
});

app.put('/todos/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const todoIndex = todos.findIndex(t => t.id === id);
  if (todoIndex === -1) {
    return res.status(404).json({ error: 'Todo non trouvée' });
  }
  const { title, completed } = req.body;
  if (title !== undefined) todos[todoIndex].title = title.trim();
  if (completed !== undefined) todos[todoIndex].completed = Boolean(completed);
  res.json(todos[todoIndex]);
});

app.delete('/todos/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const todoIndex = todos.findIndex(t => t.id === id);
  if (todoIndex === -1) {
    return res.status(404).json({ error: 'Todo non trouvée' });
  }
  todos.splice(todoIndex, 1);
  res.status(204).send();
});

app.listen(PORT, () => {
  console.log(`Serveur démarré sur http://localhost:${PORT}`);
});

Ajout des routes GET/PUT/DELETE /todos/:id avec gestion 404. req.params.id capture l'ID URL. PUT met à jour partiellement, DELETE renvoie 204 (no content). Testez ex. curl -X DELETE http://localhost:3000/todos/1. Analogie : comme un gestionnaire de tâches CRUD. Piège : parseInt pour éviter chaînes vs nombres.

Mettre à jour package.json pour dev

package.json
{
  "name": "rest-api-todos",
  "version": "1.0.0",
  "description": "REST API Todos avec Express.js",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js"
  },
  "dependencies": {
    "express": "^4.19.2"
  },
  "devDependencies": {
    "nodemon": "^3.1.4"
  }
}

Ce package.json complet ajoute des scripts start et dev. Lancez avec npm run dev pour auto-reload. Essentiel pour workflow dev fluide. Copiez-collez pour remplacer le vôtre.

Tester l'API complète

Votre API est prête ! Exemples curl :

  • GET all : curl http://localhost:3000/todos
  • POST : curl -X POST -H 'Content-Type: application/json' -d '{"title":"Test"}' http://localhost:3000/todos
  • GET id : curl http://localhost:3000/todos/1
  • PUT : curl -X PUT -H 'Content-Type: application/json' -d '{"completed":true}' http://localhost:3000/todos/1
  • DELETE : curl -X DELETE http://localhost:3000/todos/1
Utilisez Postman pour GUI.

Bonnes pratiques

  • Status codes HTTP : 200 OK, 201 Created, 400 Bad Request, 404 Not Found, 500 Internal Error.
  • Validation inputs : Toujours vérifier bodies/params avec une lib comme Joi ou Zod.
  • CORS : Ajoutez npm i cors et app.use(cors()) pour frontends externes.
  • Logging : Utilisez Morgan (npm i morgan) pour tracer les requêtes.
  • Environnement : Variables .env avec dotenv pour PORT/DB en prod.

Erreurs courantes à éviter

  • Oublier express.json() : Les POST ne lisent pas le body.
  • Ne pas gérer 404 : Ajoutez app.use((req,res)=>res.status(404).json({error:'Route non trouvée'})) en fin.
  • ID non numérique : Toujours parseInt(req.params.id) pour éviter mismatches.
  • Données persistantes : Mémoire se perd au redémarrage ; passez à MongoDB/Prisma ensuite.

Pour aller plus loin

  • Ajoutez une DB : Tutoriel Prisma avec PostgreSQL.
  • Auth : JWT avec jsonwebtoken.
  • Docs auto : Swagger (npm i swagger-ui-express).
Découvrez nos formations Learni Group pour Node.js avancé, TypeScript et architectures scalables. Partagez votre API sur GitHub !