Menu

URL e URLSearchParams in JavaScript: guida pratica

Come analizzare, costruire e modificare gli URL in JavaScript con le API URL e URLSearchParams, senza regex e senza bug nei casi limite.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Smetti di analizzare gli URL con trucchi sulle stringhe

Prima che esistesse l'API URL, gli URL si spezzettavano con split('?'), regex e tanta speranza. Funzionava quasi sempre, finché un valore non conteneva un &, un =, uno spazio o un carattere non ASCII, e a quel punto non funzionava più. Sia il browser sia Node includono un vero parser. Usalo.

Una sola chiamata, e ogni parte dell'URL è già separata e decodificata correttamente. Il costruttore lancia un TypeError sugli input non validi, e di solito è proprio quello che vuoi: un URL senza senso deve fallire in modo evidente, invece di produrre in silenzio dati senza senso più avanti.

Leggere i parametri della query

Ogni URL ha una proprietà .searchParams: un oggetto URLSearchParams che sa leggere e scrivere la query string:

Alcune cose da notare:

  • I valori arrivano già decodificati. ?name=Ada%20Lovelace ti restituisce "Ada Lovelace".
  • Tutto è una stringa. "2" non è 2. Converti con Number() se ti serve un numero.
  • Le chiavi ripetute sono ammesse. get restituisce la prima corrispondenza; getAll le restituisce tutte.
  • Le chiavi mancanti restituiscono null, non undefined, quindi ?? "default" funziona bene con loro.

Costruire una query string

Puoi costruire una query string da zero con URLSearchParams, senza escape manuali e senza unire pezzi con &:

Oppure creala a partire da un oggetto: va bene qualsiasi iterabile di coppie [chiave, valore], e anche un semplice oggetto:

set e append: set sostituisce qualsiasi valore esistente per quella chiave. append ne aggiunge un altro. Usa append quando una chiave può ripetersi legittimamente (tag, filtri); usa set per i parametri a valore singolo.

Modificare un URL

Dato che URL è un oggetto vivo, modificare searchParams aggiorna automaticamente .search e .href:

È il modo idiomatico per aggiungere un parametro a un URL esistente. Nessun controllo del tipo "l'URL ha già un ?", nessun dubbio se anteporre & o ?.

Allo stesso modo puoi cambiare le altre parti dell'URL:

Scorrere i parametri

URLSearchParams è iterabile. for...of ti dà coppie [chiave, valore], e ci sono i soliti helper keys(), values() ed entries():

Nota che le chiavi ripetute compaiono più volte: vedrai tag = web e poi tag = beginner come voci separate. È fedele alla query string reale.

Se vuoi un semplice oggetto per una stampa di debug veloce, Object.fromEntries funziona, ma accorpa le ripetizioni tenendo solo l'ultimo valore:

Va bene per il debug. È sbagliato se una chiave può ripetersi.

Gli URL relativi hanno bisogno di una base

new URL("/search?q=js") da solo lancia un errore: un percorso relativo non è un URL valido di per sé. Passa una base come secondo argomento:

Le regole di risoluzione sono le stesse che i browser usano per <a href>: una / iniziale è assoluta rispetto all'host, senza barra è relativa al percorso corrente, .. risale di un livello. Molto comodo quando componi URL di API a partire da una base configurata.

Nel browser, window.location.href è una base già pronta per analizzare l'URL della pagina corrente:

const u = new URL(window.location.href);
const page = u.searchParams.get("page") ?? "1";

Gestire gli URL non validi

Il costruttore URL lancia un errore sugli input malformati. È utile, ma significa che ti serve try/catch quando analizzi qualcosa digitato dall'utente o inviato da un sistema esterno:

Gli ambienti moderni espongono anche URL.canParse(input): un controllo booleano che ti evita il giro di try/catch quando vuoi solo validare:

Un piccolo esempio completo

Mettiamo tutto insieme: leggi i filtri correnti da un URL, modificali e produci un nuovo URL verso cui navigare:

Passare null elimina il parametro. Qualsiasi altro valore lo imposta o lo sovrascrive. È uno schema che finirai per scrivere in una forma o nell'altra ogni volta che costruisci interfacce con filtri, paginazione o deep link.

Cosa portarsi a casa

  • new URL(string) analizza un URL e lo divide in parti con un nome. Lancia un errore se l'input non ha senso.
  • url.searchParams è un URLSearchParams: usa get, getAll, set, append, delete, has.
  • La codifica avviene da sola. Non ricorrere a encodeURIComponent a meno che tu non stia costruendo stringhe a mano.
  • Passa un URL base come secondo argomento per risolvere i percorsi relativi.
  • URL.canParse (oppure try/catch) è il tuo strumento di validazione per gli input non affidabili.

Ogni volta che ti viene la tentazione di spezzare un URL con .split('?') o di estrarre un parametro della query con una regex, usa invece queste API. Sono più brevi, corrette e già incluse nel runtime.

Domande frequenti

Come si analizza un URL in JavaScript?

Passa la stringa al costruttore URL: const u = new URL('https://example.com/path?x=1'). L'oggetto risultante espone protocol, host, pathname, search, hash e l'helper searchParams. Lancia un errore sugli URL non validi, quindi avvolgilo in try/catch quando analizzi input non affidabili.

Come ottengo un parametro della query string in JavaScript?

Usa url.searchParams.get('nome'). Restituisce il valore già decodificato, oppure null se il parametro non c'è. Per i parametri che possono ripetersi (?tag=a&tag=b), usa searchParams.getAll('tag') per ottenere tutti i valori in un array.

Qual è la differenza tra URL e URLSearchParams?

URL analizza e rappresenta un URL intero: protocollo, host, percorso, query, hash. URLSearchParams è solo la parte della query string, e puoi usarlo da solo per costruire o leggere stringhe come a=1&b=2. Ogni istanza di URL ha una proprietà .searchParams che è un URLSearchParams collegato a quell'URL.

Devo codificare a mano i parametri della query?

No. URLSearchParams codifica chiavi e valori in automatico quando chiami set o append, o quando rileggi la stringa. Gestisce correttamente spazi, &, = e Unicode. Ricorri a encodeURIComponent solo quando costruisci una stringa a mano, cosa che di solito non dovresti fare.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA