Creare un server HTTP
Prima di iniziare: le parole della lezione
- HTTP e server HTTP
- HTTP è il protocollo con cui un client invia richieste e riceve risposte. Un server HTTP resta in ascolto e applica una funzione a ogni richiesta ricevuta.
- Porta e localhost
- Una porta identifica un punto di accesso di rete di un processo.
localhostindica il computer locale; 3000 è una porta di sviluppo convenzionale. - req, res e route
reqè l’oggetto della richiesta;rescostruisce la risposta. Una route è una regola che collega metodo e percorso a una funzione di gestione.- Header e status
- Gli header sono metadati della richiesta o risposta. Lo status è il codice numerico che ne descrive l’esito; 200 indica successo, 404 risorsa non trovata.
Node include node:http, utile per capire il funzionamento di un server senza librerie esterne.
// server.cjs
const http = require('node:http');
const server = http.createServer((req, res) => {
if (req.url === '/' && req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
return res.end('Benvenuto!');
}
res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('Non trovato');
});
server.listen(3000, () => console.log('http://localhost:3000'));
Avvia con node server.cjs, visita http://localhost:3000 e prova /manca per il 404.
Concetto chiave: req contiene i dati della richiesta, res costruisce la risposta. Per il routing complesso, Express riduce il codice ripetitivo.
Chi fa cosa, e perché
http.createServer crea il server e registra la callback, ma non apre da solo la porta. listen lo mette in ascolto. Il callback di listen viene eseguito all’avvio; quello di createServer viene richiamato per ogni richiesta.
res.writeHead imposta status e header; res.write può inviare una parte del contenuto; res.end conclude la risposta, eventualmente con l’ultimo contenuto. Dopo aver risposto, un return evita di cadere nel ramo 404. Un server resta attivo perché ha risorse di rete in ascolto: fermalo con Ctrl+C.
Un altro esempio guidato
// ora.cjs — node ora.cjs
const http = require('node:http');
const server = http.createServer((req, res) => {
const url = new URL(req.url, 'http://localhost');
if (req.method === 'GET' && url.pathname === '/ora') {
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
return res.end(JSON.stringify({ ora: new Date().toISOString() }));
}
res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('Percorso non trovato');
});
server.listen(3000, '127.0.0.1', () => console.log('Apri http://127.0.0.1:3000/ora'));
Come leggerlo e risultato atteso. new URL separa il percorso dalla query: anche /ora?formato=iso ha pathname /ora. La data è convertita in testo ISO; JSON.stringify produce il body JSON. Un’altra route riceve 404. Il server dell’esempio ascolta solo sull’interfaccia locale.
Prova tu. Apri /ora due volte e confronta i timestamp; prova poi un percorso inesistente e controlla lo status negli strumenti di rete del browser.