Federico Lelli / SchoolNode.js & Express
LEZIONE 25 · CRUD e architettura

API POST: creare risorse

Prima di iniziare: le parole della lezione

Creazione e validazione
Creare significa aggiungere una risorsa con una propria identità. Validare significa controllare i dati prima che modifichino lo stato.
Normalizzazione e whitelist
Normalizzare significa portare dati in una forma coerente, per esempio togliere spazi esterni. Una whitelist è l’elenco dei campi esplicitamente accettati.
Location
Header di risposta che può indicare l’URL della risorsa appena creata.

POST inserisce una nuova risorsa. I dati arrivano spesso nel body JSON, da validare prima dell'inserimento.

app.use(express.json());
let prossimoId = 3;
app.post('/api/persone', (req, res) => {
  const nome = req.body?.nome;
  if (typeof nome !== 'string' || !nome.trim()) {
    return res.status(400).json({ errore: 'Nome obbligatorio' });
  }
  const persona = { id: prossimoId++, nome: nome.trim() };
  persone.push(persona);
  res.status(201).json(persona);
});

Esempio aggiuntivo: due POST con lo stesso nome generano due record con ID distinti. In un'app reale occorrono regole di unicità e un database se sono richiesti.

Chi fa cosa, e perché

Il client invia il nome; il server controlla tipo e contenuto, assegna l’ID e aggiunge il record. Il client non deve scegliere l’ID per questa POST. trim() rimuove gli spazi iniziali e finali; va chiamato dopo aver verificato che il valore sia una stringa.

prossimoId++ usa il valore corrente e poi incrementa il contatore. È sufficiente per l’esempio con un singolo processo e dati in RAM. Non usare persone.length + 1: dopo una cancellazione potresti riutilizzare un ID già presente. In un sistema persistente la generazione degli ID va coordinata con l’archivio.

Un altro esempio guidato

// Frammento per l'API: persone e prossimoId già definiti
app.post('/api/iscritti', (req, res) => {
  const nome = req.body?.nome;
  if (typeof nome !== 'string' || nome.trim().length < 2) {
    return res.status(400).json({ errore: 'Nome di almeno 2 caratteri' });
  }
  const persona = { id: prossimoId++, nome: nome.trim() };
  persone.push(persona);
  return res.status(201).location(`/api/persone/${persona.id}`).json(persona);
});

Come leggerlo e risultato atteso. Il parser JSON deve essere registrato prima della route. ?. legge nome senza errore se il body manca. push modifica l’array; la risposta 201 restituisce la nuova persona. Location rimanda alla route di dettaglio già esistente per la stessa collezione.

Prova tu. Invia un ID nel body e verifica che il server usi quello generato da lui. Invia poi due POST uguali: senza una regola di unicità o idempotenza creano due persone diverse.

Torna all’indice ↑

Materiali didattici curati e rielaborati da Federico Lelli. Le fonti e i riferimenti specifici sono indicati nei materiali disponibili.