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%20Lovelaceti restituisce"Ada Lovelace". - Tutto è una stringa.
"2"non è2. Converti conNumber()se ti serve un numero. - Le chiavi ripetute sono ammesse.
getrestituisce la prima corrispondenza;getAllle restituisce tutte. - Le chiavi mancanti restituiscono
null, nonundefined, 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è unURLSearchParams: usaget,getAll,set,append,delete,has.- La codifica avviene da sola. Non ricorrere a
encodeURIComponenta meno che tu non stia costruendo stringhe a mano. - Passa un URL base come secondo argomento per risolvere i percorsi relativi.
URL.canParse(oppuretry/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.