Intermédiaire50 min30 XP
Objectifs de cette leçon
- Comprendre les principes REST
- Implémenter CRUD avec Express
- Utiliser les codes HTTP appropriés
API REST avec Node.js 🔄
Développer une API CRUD complète
Une API REST suit les conventions HTTP pour créer, lire, modifier, et supprimer des ressources.
Structure du projet
mon-api/ ├── package.json ├── src/ │ ├── server.js │ ├── routes/ │ │ └── users.js │ └── middleware/ │ └── validate.js └── .env
Serveur principal
// src/server.js import express from 'express'; import usersRouter from './routes/users.js'; const app = express(); app.use(express.json()); app.use('/api/users', usersRouter); // Gestion des erreurs globale app.use((err, req, res, next) => { console.error(err.stack); res.status(err.status || 500).json({ error: err.message || 'Erreur interne' }); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`API sur http://localhost:${PORT}`); });
Routes CRUD
// src/routes/users.js import { Router } from 'express'; import crypto from 'node:crypto'; const router = Router(); let users = [ { id: '1', nom: 'Alice', email: 'alice@test.com' }, { id: '2', nom: 'Bob', email: 'bob@test.com' } ]; // GET /api/users — Lire tous les utilisateurs router.get('/', (req, res) => { res.json(users); }); // GET /api/users/:id — Lire un utilisateur router.get('/:id', (req, res) => { const user = users.find(u => u.id === req.params.id); if (!user) return res.status(404).json({ error: 'Non trouvé' }); res.json(user); }); // POST /api/users — Créer un utilisateur router.post('/', (req, res) => { const { nom, email } = req.body; if (!nom || !email) { return res.status(400).json({ error: 'nom et email requis' }); } const newUser = { id: crypto.randomUUID(), nom, email }; users.push(newUser); res.status(201).json(newUser); }); // PUT /api/users/:id — Modifier un utilisateur router.put('/:id', (req, res) => { const index = users.findIndex(u => u.id === req.params.id); if (index === -1) return res.status(404).json({ error: 'Non trouvé' }); users[index] = { ...users[index], ...req.body }; res.json(users[index]); }); // DELETE /api/users/:id — Supprimer un utilisateur router.delete('/:id', (req, res) => { const index = users.findIndex(u => u.id === req.params.id); if (index === -1) return res.status(404).json({ error: 'Non trouvé' }); users.splice(index, 1); res.status(204).send(); }); export default router;
Codes de statut HTTP
| Code | Signification | Quand l'utiliser |
|---|---|---|
200 | OK | Succès avec données |
201 | Created | Ressource créée |
204 | No Content | Succès sans corps |
400 | Bad Request | Données invalides |
401 | Unauthorized | Non authentifié |
403 | Forbidden | Non autorisé |
404 | Not Found | Ressource introuvable |
500 | Server Error | Erreur interne |
Validation des données
// src/middleware/validate.js export function validateUser(req, res, next) { const { nom, email } = req.body; const erreurs = []; if (!nom || nom.length < 2) { erreurs.push('Le nom doit contenir au moins 2 caractères'); } if (!email || !email.includes('@')) { erreurs.push('Email invalide'); } if (erreurs.length > 0) { return res.status(400).json({ errors: erreurs }); } next(); }
import { validateUser } from '../middleware/validate.js'; router.post('/', validateUser, (req, res) => { // Les données sont validées ici // ... });
Résumé
| Concept | Description |
|---|---|
| CRUD | Create, Read, Update, Delete |
| REST | Architecture basée sur les verbes HTTP |
| Router | Organisation des routes |
| Statuts | Codes de réponse standardisés |
| Validation | Vérification des données entrantes |
Exercices 🎯
- Crée une API CRUD pour des articles de blog avec titre, contenu et date
- Ajoute un système de pagination (
?page=1&limit=10) - Ajoute un middleware de filtrage (
?nom=Alice)
⚡ Simulateur — API REST
Étape 1/5📝 Pseudo-code
1app.get("/users", (req, res) => res.json(users));
2app.post("/users", (req, res) => {
3 users.push(req.body);
4 res.status(201).json(req.body);
5});
⚙️ Exécution
📦 Mémoire
users
[]
🔀 Flux d'exécution
GET /users
3
Route GET /users
app.get("/users") définit une route GET qui retourne la liste des utilisateurs en JSON. C'est l'opération de lecture (R de CRUD).