API GET: elenco e dettaglio
Prima di iniziare: le parole della lezione
- Risorsa e collezione
- Una risorsa è un’entità esposta dall’API, per esempio una persona. Una collezione è un insieme di risorse.
- Proiezione e contratto
- Una proiezione sceglie quali campi restituire. Il contratto dell’API descrive URL, input, formato di risposta ed errori attesi.
- RAM e persistenza
- La RAM conserva i dati del processo in memoria. La persistenza li salva in modo da ritrovarli dopo un riavvio, per esempio in un database.
GET recupera risorse e non dovrebbe modificarle. Spesso un'API espone due route: elenco e dettaglio.
const persone = [{ id: 1, nome: 'Anna' }, { id: 2, nome: 'Luca' }];
app.get('/api/persone', (req, res) => res.json(persone));
app.get('/api/persone/:id', (req, res) => {
const persona = persone.find(p => p.id === Number(req.params.id));
if (!persona) return res.status(404).json({ errore: 'Non trovata' });
res.json(persona);
});
Esempio aggiuntivo: GET /api/persone restituisce un array; GET /api/persone/1 un singolo oggetto. Gli esempi usano un array in memoria, quindi i dati scompaiono al riavvio.
Chi fa cosa, e perché
La GET dell’elenco restituisce più persone; quella del dettaglio ne cerca una. Una lista vuota è un risultato diverso da un singolo ID non trovato: nella prima situazione puoi rispondere 200 con [], nella seconda 404. La ricerca con find è lineare: su un array deve esaminare elementi fino a trovare quello giusto.
Importare persone.cjs non collega automaticamente una lettura al file sorgente a ogni richiesta. I dati caricati vivono nel processo: modificarli non riscrive il file JavaScript. Inoltre il contratto deve essere coerente: questa lezione restituisce un array nell’elenco, mentre il laboratorio aggiunge un oggetto con metadati totale e dati.
Un altro esempio guidato
// Frammento: app Express e array persone già definiti
app.get('/api/rubrica', (req, res) => {
const dati = persone.map(({ id, nome }) => ({ id, nome }));
res.json({ totale: dati.length, dati });
});
Come leggerlo e risultato atteso. map costruisce un nuovo array; il destructuring legge solo id e nome; l’oggetto finale espone quei campi. Se internamente aggiungi altri dati alla persona, questa risposta non li include automaticamente. Il totale qui è la lunghezza dell’elenco restituito.
Prova tu. Aggiungi un campo interno all’array e verifica che non compaia nella rubrica. Poi verifica elenco vuoto, ID valido e ID inesistente.