TW3 — Technologies du Web 3

Requêtes et réponses

Exploiter l'objet req (params, query, body, headers) et construire des réponses avec res et les bons codes HTTP.

Chaque handler Express reçoit deux objets : l'un décrit ce que le client demande, l'autre sert à lui répondre. Les maîtriser, c'est écrire des API prévisibles.

📥 L'objet req

Les principales propriétés de l'objet req (Request) transmis à chaque handler :

Prop

Type

app.post("/api/users/:id/messages", (req, res) => {
  const { id } = req.params;
  const { brouillon } = req.query;
  const { contenu } = req.body;
  const langue = req.headers["accept-language"];

  res.status(201).json({ id, brouillon, contenu, langue });
});

req.body vaut undefined si aucun parseur n'est branché. Pour du JSON, app.use(express.json()) est indispensable.

📤 L'objet res

res.status(201).json({ id: 12 });          // JSON + code
res.send("<h1>Bonjour</h1>");              // HTML ou texte
res.status(204).end();                     // aucun contenu
res.redirect(302, "/connexion");           // redirection
res.set("X-Total-Count", "42").json(liste);// en-tête personnalisé

Les principales méthodes de l'objet res (Response) :

Prop

Type

Points d'attention :

  • res.json() sérialise et pose Content-Type: application/json ;
  • res.send() devine le type selon l'argument (chaîne → HTML, objet → JSON) ;
  • ces méthodes terminent la réponse : en appeler deux provoque l'erreur Cannot set headers after they are sent.
// ❌ deux réponses pour une requête
app.get("/ko", (req, res) => {
  res.json({ a: 1 });
  res.json({ b: 2 }); // ERR_HTTP_HEADERS_SENT
});

// ✅ un return coupe l'exécution
app.get("/ok", (req, res) => {
  if (!req.query.id) return res.status(400).json({ error: "id requis" });
  res.json({ id: req.query.id });
});

🔢 Choisir le bon code HTTP

CodeQuand l'utiliser
200Lecture ou mise à jour réussie avec contenu
201Ressource créée (POST) — ajouter l'en-tête Location
204Succès sans corps (DELETE typiquement)
400Requête mal formée ou données invalides
401Authentification absente ou invalide
403Authentifié mais non autorisé
404Ressource inexistante
409Conflit (doublon d'email, par exemple)
422Entité bien formée mais sémantiquement invalide
500Erreur inattendue du serveur

Règle mnémotechnique : 2xx ça marche, 4xx la faute vient du client, 5xx la faute vient du serveur.

app.post("/api/articles", (req, res) => {
  if (!req.body?.titre) {
    return res.status(400).json({ error: "Le titre est obligatoire" });
  }
  const article = { id: 12, ...req.body };
  res.status(201).location(`/api/articles/${article.id}`).json(article);
});

🧾 Une forme de réponse cohérente

Standardisez le format d'erreur pour que le client n'ait qu'un cas à traiter :

{ "error": "Article introuvable", "code": "ARTICLE_NOT_FOUND" }

✅ Points clés

  • params identifie, query filtre, body transporte les données, headers porte les métadonnées.
  • Une requête = une seule réponse ; utilisez return avant res.
  • 201 pour une création, 204 pour une suppression réussie.

Express

Terminez le quiz du chapitre pour le marquer comme complété.

Tableau de bord

On this page