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.