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

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.

Torna all’indice ↑

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