L'API URLSearchParams
fournit une interface cohérente aux éléments de l'URL et permet une manipulation simple de la chaîne de requête (éléments situés après ?
).
Traditionnellement, les développeurs utilisent des expressions régulières et la division de chaîne pour extraire les paramètres de requête de l'URL. Si nous sommes tous honnêtes avec nous-mêmes, ce n'est pas amusant.
Cela peut être fastidieux et source d'erreurs. L'un de mes secrets les plus sombres est que j'ai réutilisé les mêmes méthodes d'assistance get|set|removeURLParameter
dans plusieurs grandes applications Google.com, y compris Google Santa Tracker et le site Web Google I/O 2015.
Il est temps qu'une API appropriée effectue ces tâches à notre place.
API URLSearchParams
Chrome 49 implémente URLSearchParams
à partir de la spécification de l'URL, une API utile pour manipuler les paramètres de requête d'URL. Je considère URLSearchParams
comme une commodité équivalente aux URL, comme FormData
l'était pour les formulaires.
Que pouvez-vous faire avec ? À partir d'une chaîne d'URL, vous pouvez facilement extraire les valeurs des paramètres:
// 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);
}
définir une valeur de paramètre:
params.set('version', 2);
ajouter une autre valeur à un paramètre existant:
params.append('person', 'Tim');
params.getAll('person') === ['Eric', 'Tim']
supprimez un ou plusieurs paramètres :
params.delete('person');
Utiliser des URL
La plupart du temps, vous travaillerez probablement avec des URL complètes ou modifierez l'URL de votre application. Le constructeur URL
peut être particulièrement utile dans les cas suivants:
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'
Pour apporter des modifications réelles à l'URL, vous pouvez récupérer des paramètres, mettre à jour leurs valeurs, puis utiliser history.replaceState
pour mettre à jour l'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
Ici, j'ai utilisé des chaînes de modèle ES6 pour reconstruire une URL mise à jour à partir du chemin d'URL existant de l'application et des paramètres modifiés.
Intégration à d'autres URL de lieux
Par défaut, l'envoi de FormData
dans une requête d'API fetch()
crée un corps multiparti.
Si vous en avez besoin, URLSearchParams
fournit un mécanisme alternatif aux données POST encodées en URL plutôt qu'en multiparties mime.
const params = new URLSearchParams();
params.append('api_key', '1234567890');
fetch('https://example.com/api', {
method: 'POST',
body: params
}).then(...)
Bien qu'il ne soit pas encore implémenté dans Chrome, URLSearchParams
s'intègre également au constructeur URL
et aux balises a
. Les deux sont compatibles avec notre nouveau copain en fournissant une propriété en lecture seule, .searchParams
, pour accéder aux paramètres de requête:
const url = new URL(location);
const foo = url.searchParams.get('foo') || 'somedefault';
Les liens disposent également d'une propriété .searchParams
:
const a = document.createElement('a');
a.href = 'https://example.com?filter=api';
// a.searchParams.get('filter') === 'api';
Détection des fonctionnalités et compatibilité avec les navigateurs
Actuellement, Chrome 49, Firefox 44 et Opera 36 sont compatibles avec URLSearchParams
.
if ('URLSearchParams' in window) {
// Browser supports URLSearchParams
}
Pour les polyfills, je vous recommande celui disponible sur github.com/WebReflection/url-search-params.
Démo
Essayez l'exemple.
Pour voir URLSearchParams
dans une application concrète, consultez le générateur d'icônes Material Design de Polymer. Je l'ai utilisé pour configurer l'état initial de l'application à partir d'un lien profond. Très pratique :)