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 :

VerbeAdresseActionRéponse
GET/tachesLister les tâches200 + la liste
GET/taches/2Lire une tâche200, ou 404 si absente
POST/tachesCréer une tâche201 + la tâche créée
PATCH/taches/2Modifier une tâche200 + la tâche modifiée
DELETE/taches/2Supprimer une tâche204 (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.