Node.js contient tout le nécessaire pour comprendre le fonctionnement d’une API HTTP. Nous allons exposer une ressource de tâches, lire du JSON et renvoyer des statuts cohérents sans framework.
Initialiser le projet
~~~bash mkdir api-json && cd api-json npm init -y ~~~
Ajoutez type module dans package.json, puis créez server.js :
~~~javascript import { createServer } from 'node:http';
const tasks = [{ id: 1, title: 'Lire la documentation', done: false }];
function json(response, status, data) { response.writeHead(status, { 'content-type': 'application/json; charset=utf-8', }); response.end(JSON.stringify(data)); }
async function readJson(request) { const chunks = []; let size = 0; for await (const chunk of request) { size += chunk.length; if (size > 100_000) throw new Error('BODY_TOO_LARGE'); chunks.push(chunk); } return JSON.parse(Buffer.concat(chunks).toString('utf8')); }
const server = createServer(async (request, response) => { try { if (request.method === 'GET' && request.url === '/tasks') { return json(response, 200, { data: tasks }); } if (request.method === 'POST' && request.url === '/tasks') { const body = await readJson(request); if (typeof body.title !== 'string' || !body.title.trim()) { return json(response, 422, { error: 'title est obligatoire' }); } const task = { id: tasks.length + 1, title: body.title.trim(), done: false }; tasks.push(task); return json(response, 201, { data: task }); } return json(response, 404, { error: 'Route inconnue' }); } catch (error) { const status = error.message === 'BODY_TOO_LARGE' ? 413 : 400; return json(response, status, { error: 'Requête invalide' }); } });
server.listen(3000, '127.0.0.1', () => console.log('http://127.0.0.1:3000')); ~~~
Tester
~~~bash node server.js curl http://127.0.0.1:3000/tasks curl -X POST http://127.0.0.1:3000/tasks -H 'content-type: application/json' -d '{"title":"Tester API"}' ~~~
Vérifiez aussi JSON invalide, titre vide, corps trop gros et route inconnue.
Production
La mémoire disparaît au redémarrage : branchez une base. Ajoutez schéma de validation, authentification, logs corrélés, timeouts et arrêt propre. Un framework simplifiera le routage, mais ces règles HTTP resteront identiques.
FAQ
Pourquoi 422 pour un titre invalide ?
La syntaxe JSON est valide, mais sa signification ne respecte pas le contrat.
Faut-il autoriser CORS ?
Seulement pour les origines nécessaires. CORS n’est pas une authentification.