0 XP
?
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

CodeSignificationQuand l'utiliser
200OKSuccès avec données
201CreatedRessource créée
204No ContentSuccès sans corps
400Bad RequestDonnées invalides
401UnauthorizedNon authentifié
403ForbiddenNon autorisé
404Not FoundRessource introuvable
500Server ErrorErreur 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é

ConceptDescription
CRUDCreate, Read, Update, Delete
RESTArchitecture basée sur les verbes HTTP
RouterOrganisation des routes
StatutsCodes de réponse standardisés
ValidationVérification des données entrantes

Exercices 🎯

  1. Crée une API CRUD pour des articles de blog avec titre, contenu et date
  2. Ajoute un système de pagination (?page=1&limit=10)
  3. 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).