Query string e filtri
Prima di iniziare: le parole della lezione
- Query string e filtro
- La query string è la parte dell’URL dopo
?, composta da coppie chiave-valore separate da&. Un filtro seleziona elementi secondo una condizione. - Paginazione, limite e offset
- La paginazione divide un insieme in parti. Il limite indica quanti elementi restituire; l’offset quanti saltarne dall’inizio.
- filter e slice
filtercrea un array con gli elementi che soddisfano una condizione.slicerestituisce una porzione senza modificare l’array originale.
I parametri query seguono ? nell'URL: /api/persone?cerca=an&limite=5. In Express sono in req.query, che contiene input da considerare non attendibile.
app.get('/api/persone', (req, res) => {
const cerca = String(req.query.cerca ?? '').toLowerCase();
const limiteRaw = Number(req.query.limite ?? 10);
const limite = Number.isInteger(limiteRaw)
? Math.min(Math.max(limiteRaw, 1), 100) : 10;
const risultato = persone
.filter(p => p.nome.toLowerCase().includes(cerca))
.slice(0, limite);
res.json(risultato);
});
Esempio aggiuntivo: la ricerca ?cerca=lu&limite=1 restituisce al massimo una persona il cui nome contiene lu. Per grandi dataset filtri e paginazione andrebbero applicati nel database, non all'array intero.
Chi fa cosa, e perché
Il parametro di percorso identifica tipicamente “quale persona”; la query descrive “quali persone, con quale filtro e limite”. /persone/2 e /persone?limite=2 hanno quindi significati diversi. req.query dipende dal parser configurato: non dare per scontato che ogni valore sia una stringa singola, soprattutto con parametri ripetuti.
La trascrizione usa una ricerca per prefisso: startsWith("an") trova Anna ma non Gianna. Nell’esempio del manuale includes("an") cerca invece in qualsiasi posizione. Documenta quale comportamento scegli. Con una collezione vuota o nessun risultato, una risposta 200 con elenco vuoto è normalmente corretta.
Un altro esempio guidato
// Costruire una query senza concatenare a mano i valori
const query = new URLSearchParams({ cerca: 'Anna Maria', limite: '2' });
console.log(`/api/persone?${query}`);
// /api/persone?cerca=Anna+Maria&limite=2
// Esempio di paginazione su un array già filtrato
const risultati = ['Anna', 'Luca', 'Sara', 'Marta'];
const offset = 2;
const limite = 2;
console.log(risultati.slice(offset, offset + limite));
Come leggerlo e risultato atteso. URLSearchParams codifica lo spazio nella query. L’ultima stampa contiene Sara e Marta: il secondo argomento di slice è l’indice finale escluso. Per una paginazione stabile serve un ordine definito dei risultati.
Prova tu. Prova limite assente, 0, testo e una chiave ripetuta. Decidi se correggere i valori fuori intervallo o rispondere 400, e mantieni la stessa regola nella tua API.