Derrière presque chaque application mobile et chaque site moderne se trouve une API : le programme qui reçoit les demandes de l'application, lit et enregistre les données, puis répond. Dans ce tutoriel, vous construisez une vraie API REST avec Node.js et Express pour gérer une liste de tâches : créer, lire, modifier et supprimer.
Niveau : débutant à intermédiaire (connaître les bases de JavaScript). Durée : environ 45 minutes. Le code a été vérifié avec Node.js 22 et Express 5.2 : 12 vérifications automatiques réussies (création, validation, filtres, modification, suppression, erreurs).
REST en deux minutes
Une API REST organise les données en ressources (ici, les tâches) accessibles par des adresses, et utilise les verbes HTTP pour dire ce que l'on veut faire :
| Verbe | Adresse | Action | Réponse |
|---|---|---|---|
| GET | /taches | Lister les tâches | 200 + la liste |
| GET | /taches/2 | Lire une tâche | 200, ou 404 si absente |
| POST | /taches | Créer une tâche | 201 + la tâche créée |
| PATCH | /taches/2 | Modifier une tâche | 200 + la tâche modifiée |
| DELETE | /taches/2 | Supprimer une tâche | 204 (pas de contenu) |
Les données circulent au format JSON, lisible par tous les langages : votre API pourra servir une application Flutter, un site web ou un autre serveur.
Étape 1 : installer Node.js et créer le projet
Installez la version LTS de Node.js depuis le site officiel nodejs.org. Puis, dans un terminal :
mkdir api-taches
cd api-taches
npm init -y
npm install express
npm init -y crée le fichier package.json qui décrit le projet ; npm install express ajoute Express, le framework web le plus utilisé avec Node.js.
Étape 2 : le code de l'API
Créez un fichier server.js avec le contenu suivant :
const express = require('express');
const app = express();
app.use(express.json());
// Données en mémoire (remplacées par une base de données en production).
let taches = [
{ id: 1, titre: 'Préparer le devis client', faite: false },
];
let prochainId = 2;
// Lister les tâches (filtre optionnel : /taches?faite=true)
app.get('/taches', (req, res) => {
const { faite } = req.query;
if (faite === undefined) return res.json(taches);
res.json(taches.filter((t) => t.faite === (faite === 'true')));
});
// Lire une tâche
app.get('/taches/:id', (req, res) => {
const tache = taches.find((t) => t.id === Number(req.params.id));
if (!tache) return res.status(404).json({ erreur: 'Tâche introuvable' });
res.json(tache);
});
// Créer une tâche
app.post('/taches', (req, res) => {
const titre = typeof req.body?.titre === 'string' ? req.body.titre.trim() : '';
if (!titre) return res.status(400).json({ erreur: 'Le titre est obligatoire' });
const tache = { id: prochainId++, titre, faite: false };
taches.push(tache);
res.status(201).json(tache);
});
// Modifier une tâche (titre et/ou statut)
app.patch('/taches/:id', (req, res) => {
const tache = taches.find((t) => t.id === Number(req.params.id));
if (!tache) return res.status(404).json({ erreur: 'Tâche introuvable' });
const { titre, faite } = req.body ?? {};
if (titre !== undefined) {
if (typeof titre !== 'string' || !titre.trim()) {
return res.status(400).json({ erreur: 'Titre invalide' });
}
tache.titre = titre.trim();
}
if (faite !== undefined) {
if (typeof faite !== 'boolean') return res.status(400).json({ erreur: 'faite doit valoir true ou false' });
tache.faite = faite;
}
res.json(tache);
});
// Supprimer une tâche
app.delete('/taches/:id', (req, res) => {
const avant = taches.length;
taches = taches.filter((t) => t.id !== Number(req.params.id));
if (taches.length === avant) return res.status(404).json({ erreur: 'Tâche introuvable' });
res.status(204).end();
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`API démarrée sur http://localhost:${PORT}`));
Étape 3 : comprendre le code
express.json()
Cette ligne demande à Express de lire automatiquement le corps des requêtes au format JSON. Sans elle, req.body serait vide lors d'une création.
Les routes
Chaque app.get, app.post, app.patch ou app.delete associe un verbe et une adresse à une fonction. req.params.id récupère la partie variable de l'adresse (le 2 de /taches/2), et req.query lit les paramètres après le point d'interrogation, comme ?faite=true.
La validation
Ne faites jamais confiance aux données reçues. L'API refuse un titre vide ou un statut qui n'est pas true ou false, avec un code 400 et un message clair. C'est ce qui évite des données corrompues et beaucoup de bugs dans l'application.
Les codes de réponse
Renvoyer le bon code HTTP (201 pour une création, 404 pour une ressource introuvable, 204 pour une suppression) permet à l'application cliente de réagir correctement sans analyser le texte des messages.
Étape 4 : lancer et tester
Démarrez l'API :
node server.js
Puis, dans un second terminal, testez chaque route avec curl (ou avec un outil graphique comme Postman ou Bruno) :
# Lister
curl http://localhost:3000/taches
# Créer
curl -X POST http://localhost:3000/taches -H "Content-Type: application/json" -d '{"titre": "Appeler le fournisseur"}'
# Marquer comme faite
curl -X PATCH http://localhost:3000/taches/2 -H "Content-Type: application/json" -d '{"faite": true}'
# Supprimer
curl -X DELETE http://localhost:3000/taches/2
Ouvrez aussi http://localhost:3000/taches dans votre navigateur : la liste s'affiche au format JSON.
Étape 5 : vers une API de production
Ce tutoriel garde les données en mémoire : elles disparaissent quand le serveur redémarre. Pour une vraie application, voici les étapes suivantes :
- Une base de données : PostgreSQL ou MongoDB. Voir bases de données et SQL.
- L'authentification : seuls les utilisateurs connectés doivent pouvoir modifier leurs données.
- La sécurité : HTTPS, limitation du nombre de requêtes, en-têtes de sécurité. Voir protéger une API : 10 réflexes.
- Le déploiement sur un serveur, avec redémarrage automatique en cas de panne.
Questions fréquentes
Quelle différence entre PUT et PATCH ?
PUT remplace toute la ressource, PATCH n'en modifie qu'une partie. Ici, PATCH permet de cocher une tâche sans renvoyer son titre.
Express 5 ou Express 4 ?
Express 5 est la version actuelle. Le code de ce tutoriel fonctionne avec Express 5 ; les principes sont identiques en version 4.
Comment une application Flutter appelle-t-elle cette API ?
Avec le package http de Dart : une requête GET vers /taches renvoie la liste en JSON, que l'application transforme en objets. Commencez par notre tutoriel Flutter pour la partie application.
Node.js est-il adapté à une application professionnelle ?
Oui, Node.js est utilisé par de très nombreuses plateformes à fort trafic. Il est particulièrement efficace pour les API qui gèrent beaucoup de requêtes simultanées.
Besoin d'une API pour votre projet ?
NEWTIV conçoit des API sécurisées pour applications mobiles et sites web : base de données, authentification, paiement mobile et déploiement. Demandez un devis, nous vous répondons sous 48 heures ouvrées.

Réagissez
Commentaires