Lire les requêtes et formater les réponses
Objectif : Recevoir des données JSON et renvoyer des réponses cohérentes depuis Express.
Une route peut être joignable et pourtant difficile à utiliser si elle ne sait pas lire le JSON envoyé par le client ou si chaque réponse adopte une forme différente. Vous allez configurer Express pour recevoir un corps JSON, distinguer les informations placées dans l’URL de celles placées après un point d’interrogation, puis appliquer un format commun aux réponses.
Vous avez déjà créé l’application Express et démarré le serveur dans la première leçon. Ici, vous modifiez `serveur.js` en conservant le port configurable et la route temporaire `/controle` ; les routes métier restent provisoires dans ce fichier, avant leur organisation dans des fichiers distincts lors des prochaines leçons.
Lire les corps JSON avec express.json
Un client transmet souvent les champs d’une création dans le corps de sa requête HTTP. Le middleware intégré `express.json()` analyse un corps JSON et le rend accessible dans `req.body`. Placez-le avant les routes qui doivent lire ces données : sinon, celles-ci s’exécutent avant l’analyse du corps.
Lire les informations présentes dans l’URL
Les paramètres de route sont les segments variables définis dans le chemin, comme `:id` dans `/api/commandes/:id`. Express place leur valeur dans `req.params` : pour `/api/commandes/42`, `req.params.id` vaut la chaîne `"42"`. Les paramètres de requête suivent le `?`, par exemple `?statut=en-attente`, et se lisent dans `req.query` sous forme de chaînes.
Dans l’exemple, la liste renvoie temporairement les filtres reçus afin que vous puissiez vérifier leur lecture. Une route de détail renvoie l’identifiant capturé, tandis que la création renvoie le corps reçu. Ces réponses illustrent le transport des données, pas encore la recherche ni l’enregistrement effectifs d’une commande.
Remplacer serveur.js
Remplacez le contenu de `serveur.js` par ce fichier complet. Chaque réponse utilise les mêmes clés : `donnees` contient le résultat, et `erreur` vaut `null` lorsqu’aucune erreur n’est signalée. Le code conserve la route de contrôle afin que vous puissiez continuer à vérifier que le serveur répond.
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.use(express.json());
app.get('/controle', (req, res) => {
res.json({
donnees: { message: 'Le serveur Express répond.' },
erreur: null
});
});
app.get('/api/commandes', (req, res) => {
res.json({
donnees: {
filtres: {
statut: req.query.statut || null,
produitId: req.query.produitId || null
}
},
erreur: null
});
});
app.get('/api/commandes/:id', (req, res) => {
res.json({
donnees: { id: req.params.id },
erreur: null
});
});
app.post('/api/commandes', (req, res) => {
res.status(201).json({
donnees: req.body,
erreur: null
});
});
app.listen(port, () => {
console.log(`Serveur démarré sur le port ${port}`);
});Vérifier les réponses avec curl
Démarrez le serveur avec `npm start`, puis essayez les requêtes suivantes dans un autre terminal. Pour la création, `-H` ajoute l’en-tête JSON et `-d` transmet un corps de requête ; les deux autres exemples vérifient la lecture des paramètres d’URL.
curl 'http://localhost:3000/api/commandes?statut=en-attente&produitId=7'
curl 'http://localhost:3000/api/commandes/42'
curl -X POST 'http://localhost:3000/api/commandes' \
-H 'Content-Type: application/json' \
-d '{"produitId":7,"quantite":2}'La première réponse contient les filtres sous forme de chaînes, avec `null` pour les filtres absents. La deuxième renvoie l’identifiant capturé dans le chemin. La troisième renvoie le corps JSON reçu et utilise le statut `201` pour signaler la création ; le contrat des statuts HTTP a été posé dans la leçon précédente.
{"donnees":{"filtres":{"statut":"en-attente","produitId":"7"}},"erreur":null}
{"donnees":{"id":"42"},"erreur":null}
{"donnees":{"produitId":7,"quantite":2},"erreur":null}À retenir
- Placez `app.use(express.json())` avant les routes qui lisent un corps JSON.
- Lisez les segments variables du chemin dans `req.params` et les filtres après `?` dans `req.query`.
- Un corps JSON analysé par Express est accessible dans `req.body`.
- Renvoyez systématiquement un objet avec `donnees` et `erreur`, y compris lorsqu’aucune erreur n’est présente.
Dans la prochaine leçon, vous déplacerez les routes provisoires vers une organisation dédiée par ressource.