¿Cómo crear parámetros de consulta en Javascript?


133

¿Hay alguna forma de crear los parámetros de consulta para hacer una solicitud GET en JavaScript?

Al igual que en Python urllib.urlencode(), tiene un diccionario (o una lista de dos tuplas) y crea una cadena como 'var1=value1&var2=value2'.

Respuestas:


189

Aqui tienes:

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

Uso:

const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);

12
Al iterar con for, use hasOwnProperty para garantizar la interoperabilidad.
troelskn

3
@troelskn, buen punto ... aunque en este caso, alguien tendría que extender Object.prototype para romperlo, lo cual es una muy mala idea para empezar.
Shog9

1
@ Shog9 ¿Por qué es una mala idea?
Cesar Canassa


Solo un pequeño detalle, pero ret podría ser constante
Alkis Mavridis

85

URLSearchParams tiene una mayor compatibilidad con el navegador.

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

const searchParams = new URLSearchParams(data);

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

Node.js ofrece el módulo de cadena de consulta .

const querystring = require('querystring');

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

const searchParams = querystring.stringify(data);

// searchParams === 'var1=value1&var2=value2'

1
Definitivamente el enfoque limpio y moderno. También puede llamar libremente más tardesearchParams.append(otherData)
kano

81

funcional

function encodeData(data) {
    return Object.keys(data).map(function(key) {
        return [key, data[key]].map(encodeURIComponent).join("=");
    }).join("&");
}   

1
¡Buena esa! .map () se ha implementado en JavaScript 1.6, por lo que casi todos los navegadores, incluso los de la abuela, lo admiten. Pero como puedes adivinar, IE no lo hace excepto IE 9+. Pero no se preocupe, hay una solución alternativa. Fuente: 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?Debe producir https://www.something.com/?bloop1=true&bloop2=something?
dylanh724

1
@DylanHunt: Sí ...
Przemek

38

Zabba ha proporcionado en un comentario sobre la respuesta actualmente aceptada una sugerencia que para mí es la mejor solución: usar jQuery.param () .

Si uso jQuery.param()los datos en la pregunta original, entonces el código es simplemente:

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

La variable paramsserá

"var1=value&var2=value"

Para ver ejemplos, entradas y salidas más complicadas, consulte la documentación de jQuery.param () .


10

Acabamos de lanzar arg.js , un proyecto destinado a resolver este problema de una vez por todas. Tradicionalmente ha sido muy difícil, pero ahora puedes hacer:

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

Y la lectura funciona:

var name = Arg("name");

o obtener todo el lote:

var params = Arg.all();

y si le importa la diferencia entre ?query=truey #hash=truepuede usar los métodos Arg.query()y Arg.hash().


9

Esto debería hacer el trabajo:

const createQueryParams = params => 
      Object.keys(params)
            .map(k => `${k}=${encodeURI(params[k])}`)
            .join('&');

Ejemplo:

const params = { name : 'John', postcode: 'W1 2DL'}
const queryParams = createQueryParams(params)

Resultado:

name=John&postcode=W1%202DL

1
Más tarde me di cuenta de que en realidad es una versión ligeramente diferente de la respuesta de @ manav a continuación. Pero de todos modos, aún podría ser preferible para la sintaxis de ES6.
noego

En primer lugar, no está codificando las claves. Además, debe usar en encodeURIComponent()lugar de encodeURI. Lee sobre la diferencia .
Przemek

9

ES2017 (ES8)

Haciendo uso de Object.entries(), que devuelve una matriz de [key, value]pares de objetos . Por ejemplo, porque {a: 1, b: 2}volvería [['a', 1], ['b', 2]]. No es compatible (y no será) solo por IE.

Código:

const buildURLQuery = obj =>
      Object.entries(obj)
            .map(pair => pair.map(encodeURIComponent).join('='))
            .join('&');

Ejemplo:

buildURLQuery({name: 'John', gender: 'male'});

Resultado:

"name=John&gender=male"

8

Si está utilizando Prototype, hay Form.serialize

Si está utilizando jQuery, hay Ajax / serialize

Sin embargo, no conozco ninguna función independiente para lograr esto, pero una búsqueda en Google para encontrar algunas opciones prometedoras si actualmente no está utilizando una biblioteca. Sin embargo, si no lo eres, realmente deberías porque son el cielo.


66
jQuery.param () toma el objeto y lo transforma en una cadena de consulta GET (esta función coincide mejor con la pregunta).
azurkin

5

Solo me gustaría volver a esta pregunta de hace casi 10 años. En esta era de programación estándar, su mejor opción es configurar su proyecto utilizando un administrador de dependencias (npm ). Existe toda una industria artesanal de bibliotecas que codifican cadenas de consulta y se ocupan de todos los casos extremos. Este es uno de los más populares:

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


Respuesta muy inespecífica.
masterxilo

2

Una pequeña modificación al mecanografiado:

  public encodeData(data: any): string {
    return Object.keys(data).map((key) => {
      return [key, data[key]].map(encodeURIComponent).join("=");
    }).join("&");
  }

-11

Este hilo apunta a algún código para escapar de URL en php. Hay escape()y unescape()cuál hará la mayor parte del trabajo, pero necesita agregar un par de cosas adicionales.

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 maneja esto y no usa incorrectamente + para un espacio.
AnthonyWJones
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.