Comment créer des paramètres de requête en Javascript?
-
02-07-2019 - |
Question
Est-il possible de créer les paramètres de requête permettant d'effectuer une demande GET en JavaScript?
Comme en Python, vous avez urllib.urlencode ()
, qui prend un dictionnaire (ou une liste de deux tuples) et crée une chaîne telle que 'var1 = valeur1 & amp; var2 = valeur2'
.
La solution
Voilà:
function encodeQueryData(data) {
const ret = [];
for (let d in data)
ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
return ret.join('&');
}
Utilisation:
const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);
Autres conseils
fonctionnel
function encodeData(data) {
return Object.keys(data).map(function(key) {
return [key, data[key]].map(encodeURIComponent).join("=");
}).join("&");
}
Zabba a fourni dans un commentaire sur la réponse actuellement acceptée une suggestion selon laquelle, à mes yeux, est la meilleure solution: utilisez < a href = "http://api.jquery.com/jQuery.param/" rel = "nofollow noreferrer"> jQuery.param () .
Si j'utilise jQuery.param ()
sur les données de la question d'origine, le code est simplement:
const params = jQuery.param({
var1: 'value',
var2: 'value'
});
La variable params
sera
"var1=value&var2=value"
Pour obtenir des exemples plus compliqués, des entrées et des sorties, voir jQuery.param () . documentation.
URLSearchParams prend en charge de plus en plus les navigateurs.
const data = {
var1: 'value1',
var2: 'value2'
};
const searchParams = new URLSearchParams(data);
// searchParams.toString() === 'var1=value1&var2=value2'
Node.js propose le module chaîne de chaînes de caractères .
const querystring = require('querystring');
const data = {
var1: 'value1',
var2: 'value2'
};
const searchParams = querystring.stringify(data);
// searchParams === 'var1=value1&var2=value2'
Nous venons de publier arg.js , un projet visant à résoudre ce problème une fois et pour tous. Cela a toujours été si difficile, mais vous pouvez maintenant le faire:
var querystring = Arg.url({name: "Mat", state: "CO"});
Et lire des œuvres:
var name = Arg("name");
ou obtenir le tout:
var params = Arg.all();
et si vous vous souciez de la différence entre ? query = true
et # hash = true
, vous pouvez utiliser le Arg.query ()
et les méthodes Arg.hash ()
.
Cela devrait faire le travail:
const createQueryParams = params =>
Object.keys(params)
.map(k => `${k}=${encodeURI(params[k])}`)
.join('&');
Exemple:
const params = { name : 'John', postcode: 'W1 2DL'}
const queryParams = createQueryParams(params)
Résultat:
name=John&postcode=W1%202DL
Si vous utilisez Prototype , il existe Form.serialize
Si vous utilisez jQuery , il existe Ajax / serialize
Je ne connais aucune fonction indépendante pour y parvenir, mais une recherche sur Google a révélé des options prometteuses si vous n'utilisez pas actuellement de bibliothèque. Si vous ne l'êtes pas, vous devriez le faire car ils sont le paradis.
Tout comme pour revenir sur cette question de presque 10 ans. À l'ère de la programmation standard, le mieux est de configurer votre projet à l'aide d'un gestionnaire de dépendances ( npm
). Il existe toute une industrie artisanale de bibliothèques qui codent des chaînes de requête et prennent en charge tous les cas extrêmes. C’est l’un des plus populaires -
ES2017 (ES8)
Utilisation de Objet. entries ()
, qui renvoie un tableau des paires [clé, valeur]
de l'objet. Par exemple, pour {a: 1, b: 2}
, il renverrait [['a', 1], ['b', 2]]
. Il n'est pas supporté (et ne sera pas) uniquement par IE.
Code:
const buildURLQuery = obj =>
Object.entries(obj)
.map(pair => pair.map(encodeURIComponent).join('='))
.join('&');
Exemple:
buildURLQuery({name: 'John', gender: 'male'});
Résultat:
"name=John&gender=male"
Une petite modification au texte dactylographié:
public encodeData(data: any): string {
return Object.keys(data).map((key) => {
return [key, data[key]].map(encodeURIComponent).join("=");
}).join("&");
}
This thread pointe vers du code pour échapper des URL en php. Il existe escape ()
et unescape ()
, qui feront le gros du travail, mais vous devez ajouter quelques éléments supplémentaires.
function urlencode(str) {
str = escape(str);
str = str.replace('+', '%2B');
str = str.replace('%20', '+');
str = str.replace('*', '%2A');
str = str.replace('/', '%2F');
str = str.replace('@', '%40');
return str;
}
function urldecode(str) {
str = str.replace('+', ' ');
str = unescape(str);
return str;
}