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

cnu
fuente

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);
Shog9
fuente
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'
Andrew Palmer
fuente
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("&");
}   
Manav
fuente
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 () .

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

Mat Ryer
fuente
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
noego
fuente
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"
Przemek
fuente
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.

Paolo Bergantino
fuente
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

pscl
fuente
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("&");
  }
Clayton KN Passos
fuente
-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;
}
Kibbee
fuente
3
encodeURIComponent maneja esto y no usa incorrectamente + para un espacio.
AnthonyWJones