A API URLSearchParams
oferece uma interface
consistente para os bits e partes do URL e permite a manipulação trivial
da string de consulta (essas informações depois de ?
).
Tradicionalmente, os desenvolvedores usam regexs e a divisão de strings para extrair parâmetros de consulta do URL. Se formos honestos, isso não é divertido.
Pode ser tedioso e propenso a erros. Um dos meus segredos obscuros é que eu reutilizei os mesmos
get|set|removeURLParameter
métodos auxiliares em vários apps grandes do Google.com.br, incluindo o Google Santa Tracker e o Google I/O 2015 na Web.
É hora de uma API adequada que faça isso por nós.
API URLSearchParams
O Chrome 49 implementa URLSearchParams
da especificação de URL, uma API útil para mexer com parâmetros de consulta
de URL. Considero URLSearchParams
como uma conveniência equivalente aos URLs,
assim como FormData
era para formulários.
O que você pode fazer com ele? Com uma string de URL, é possível extrair facilmente os valores dos parâmetros:
// Can also constructor from another URLSearchParams
const params = new URLSearchParams('q=search+string&version=1&person=Eric');
params.get('q') === "search string"
params.get('version') === "1"
Array.from(params).length === 3
for (let p of params) {
console.log(p);
}
Defina um valor de parâmetro:
params.set('version', 2);
Anexar outro valor a um parâmetro existente:
params.append('person', 'Tim');
params.getAll('person') === ['Eric', 'Tim']
Excluir um ou mais parâmetros:
params.delete('person');
Como trabalhar com URLs
Na maioria das vezes, você provavelmente vai trabalhar com URLs completos ou modificar o
URL do app. O construtor URL
pode ser útil para estes casos:
const url = new URL('https://example.com?foo=1&bar=2');
const params = new URLSearchParams(url.search);
params.set('baz', 3);
params.has('baz') === true
params.toString() === 'foo=1&bar=2&baz=3'
Para fazer mudanças reais no URL, você pode extrair parâmetros, atualizar os valores deles
e usar history.replaceState
para atualizar o URL.
// URL: https://example.com?version=1.0
const params = new URLSearchParams(location.search);
params.set('version', 2.0);
window.history.replaceState({}, '', `${location.pathname}?${params}`);
// URL: https://example.com?version=2.0
Aqui, usei strings de modelo ES6 para reconstruir um URL atualizado do caminho de URL existente do app e dos parâmetros modificados.
Integração com outros URLs de lugares usados
Por padrão, o envio de FormData
em uma solicitação de API fetch()
cria um corpo de várias partes.
Se necessário, URLSearchParams
oferece um mecanismo alternativo para POST de dados
codificados em URL em vez de multipart mime.
const params = new URLSearchParams();
params.append('api_key', '1234567890');
fetch('https://example.com/api', {
method: 'POST',
body: params
}).then(...)
Embora ainda não esteja implementado no Chrome, o URLSearchParams
também se integra
ao URL
e às tags a
. Ambos oferecem suporte ao novo amigo, fornecendo
uma propriedade somente leitura, .searchParams
, para acessar os parâmetros de consulta:
const url = new URL(location);
const foo = url.searchParams.get('foo') || 'somedefault';
Os links também recebem uma propriedade .searchParams
:
const a = document.createElement('a');
a.href = 'https://example.com?filter=api';
// a.searchParams.get('filter') === 'api';
Detecção de recursos e suporte a navegadores
Atualmente, o Chrome 49, o Firefox 44 e o Opera 36 oferecem suporte a URLSearchParams
.
if ('URLSearchParams' in window) {
// Browser supports URLSearchParams
}
Para polyfills, recomendo o que está em github.com/WebReflection/url-search-params.
Demonstração
Teste o exemplo.
Para conferir URLSearchParams
em um app real, consulte o Iconset Generator do Polymer. Usei essa abordagem para configurar o estado inicial do app usando um link direto. Muito útil :)