Comment créer des paramètres de requête en Javascript?

133

Existe-t-il un moyen de créer les paramètres de requête pour effectuer une requête GET en JavaScript?

Tout comme en Python, vous avez urllib.urlencode(), qui prend un dictionnaire (ou une liste de deux tuples) et crée une chaîne comme 'var1=value1&var2=value2'.

cnu
la source

Réponses:

189

Voici:

function encodeQueryData(data) {
   const ret = [];
   for (let d in data)
     ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
   return ret.join('&');
}

Usage:

const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);
Shog9
la source
12
Lors de l'itération avec for, utilisez hasOwnProperty pour garantir l'interopérabilité.
troelskn
3
@troelskn, bon point ... bien que dans ce cas, quelqu'un devrait étendre Object.prototype pour le casser, ce qui est une très mauvaise idée pour commencer.
Shog9 du
1
@ Shog9 Pourquoi est-ce une mauvaise idée?
Cesar Canassa le
Juste un petit détail, mais cela pourrait être const
Alkis Mavridis
85

URLSearchParams a une prise en charge croissante des navigateurs.

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = new URLSearchParams(data);

// searchParams.toString() === 'var1=value1&var2=value2'

Node.js propose le module de chaîne de requête .

const querystring = require('querystring');

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = querystring.stringify(data);

// searchParams === 'var1=value1&var2=value2'
Andrew Palmer
la source
1
Certainement l'approche propre et moderne. Vous pouvez également appeler plus tard librementsearchParams.append(otherData)
kano
81

fonctionnel

function encodeData(data) {
    return Object.keys(data).map(function(key) {
        return [key, data[key]].map(encodeURIComponent).join("=");
    }).join("&");
}   
Manav
la source
1
Joli! .map () a été implémenté dans JavaScript 1.6 donc presque tous les navigateurs, même les plus grands, le supportent. Mais comme vous pouvez le deviner, IE n'exclut pas IE 9+. Mais ne vous inquiétez pas, il existe une solution de contournement. Source: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
Akseli Palén
var data = { bloop1: true, bloop2: "something" }; var url = "https://something.com/?"; var params = encodeData(data); var finalUrl = url + params; // Is this the right use?Devrait produire https://www.something.com/?bloop1=true&bloop2=something?
dylanh724
1
@DylanHunt: Yup…
Przemek
38

Zabba a fourni dans un commentaire sur la réponse actuellement acceptée une suggestion qui est pour moi la meilleure solution: utilisez jQuery.param () .

Si j'utilise jQuery.param()les données de la question d'origine, le code est simplement:

const params = jQuery.param({
    var1: 'value',
    var2: 'value'
});

La variable paramssera

"var1=value&var2=value"

Pour des exemples, des entrées et des sorties plus compliqués, consultez la documentation jQuery.param () .

Kirby
la source
10

Nous venons de publier arg.js , un projet visant à résoudre ce problème une fois pour toutes. C'était traditionnellement si difficile, mais maintenant vous pouvez faire:

var querystring = Arg.url({name: "Mat", state: "CO"});

Et la lecture fonctionne:

var name = Arg("name");

ou obtenir le tout:

var params = Arg.all();

et si vous vous souciez de la différence entre ?query=trueet, #hash=truevous pouvez utiliser les méthodes Arg.query()et Arg.hash().

Mat Ryer
la source
9

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
noego
la source
1
J'ai réalisé plus tard qu'il s'agissait en fait d'une version légèrement différente de la réponse de @ manav ci-dessous. Mais de toute façon, cela pourrait encore être préférable pour la syntaxe ES6.
noego
Tout d'abord, vous n'encodez pas les clés. En outre, vous devez utiliser à la encodeURIComponent()place de encodeURI. Découvrez la différence .
Przemek
9

ES2017 (ES8)

Faire usage de Object.entries(), qui renvoie un tableau de [key, value]paires d'objets . Par exemple, car {a: 1, b: 2}il reviendrait [['a', 1], ['b', 2]]. Il n'est pas pris en charge (et ne le 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"
Przemek
la source
8

Si vous utilisez Prototype, il existe Form.serialize

Si vous utilisez jQuery, il y a Ajax / serialize

Cependant, je ne connais aucune fonction indépendante pour accomplir cela, mais une recherche sur Google a révélé des options prometteuses si vous n'utilisez pas actuellement de bibliothèque. Si ce n'est pas le cas, vous devriez vraiment le faire parce qu'ils sont le paradis.

Paolo Bergantino
la source
6
jQuery.param () prend un objet et le transforme en chaîne de requête GET (cette fonction correspond mieux à la question).
azurkin
5

Je voudrais revenir sur cette question vieille de presque 10 ans. À l'ère de la programmation standard, votre meilleur pari 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 les chaînes de requête et prennent en charge tous les cas extrêmes. C'est l'un des plus populaires -

https://www.npmjs.com/package/query-string

pscl
la source
Réponse très vague.
masterxilo
2

Une petite modification au typographie:

  public encodeData(data: any): string {
    return Object.keys(data).map((key) => {
      return [key, data[key]].map(encodeURIComponent).join("=");
    }).join("&");
  }
Clayton KN Passos
la source
-11

Ce fil pointe vers du code pour échapper les URL en php. Il y a escape()et unescape()qui fera la plupart du travail, mais vous devez ajouter quelques choses 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;
}
Kibbee
la source
3
encodeURIComponent gère cela et n'utilise pas incorrectement + pour un espace.
AnthonyWJones