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'.

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);

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'

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("&");
}   

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 () .


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().


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

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"

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.


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


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("&");
  }

-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;
}

3
encodeURIComponent gère cela et n'utilise pas incorrectement + pour un espace.
AnthonyWJones
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.