Come creare parametri di query in Javascript?
-
02-07-2019 - |
Domanda
Esiste un modo per creare i parametri di query per eseguire una richiesta GET in JavaScript?
Proprio come in Python hai urllib.urlencode ()
, che contiene un dizionario (o un elenco di due tuple) e crea una stringa come 'var1 = value1 & amp; var2 = value2'
.
Soluzione
Ecco qua:
function encodeQueryData(data) {
const ret = [];
for (let d in data)
ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
return ret.join('&');
}
Utilizzo:
const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);
Altri suggerimenti
funzionale
function encodeData(data) {
return Object.keys(data).map(function(key) {
return [key, data[key]].map(encodeURIComponent).join("=");
}).join("&");
}
Zabba ha fornito in un commento sulla risposta attualmente accettata un suggerimento che per me è la soluzione migliore: usa < a href = "http://api.jquery.com/jQuery.param/" rel = "nofollow noreferrer"> jQuery.param () .
Se uso jQuery.param ()
sui dati nella domanda originale, il codice è semplicemente:
const params = jQuery.param({
var1: 'value',
var2: 'value'
});
La variabile params
sarà
"var1=value&var2=value"
Per esempi, input e output più complicati, consultare jQuery.param () documentazione.
URLSearchParams ha un supporto crescente per il browser.
const data = {
var1: 'value1',
var2: 'value2'
};
const searchParams = new URLSearchParams(data);
// searchParams.toString() === 'var1=value1&var2=value2'
Node.js offre il modulo querystring .
const querystring = require('querystring');
const data = {
var1: 'value1',
var2: 'value2'
};
const searchParams = querystring.stringify(data);
// searchParams === 'var1=value1&var2=value2'
Abbiamo appena rilasciato arg.js , un progetto volto a risolvere questo problema una volta e per tutti. Tradizionalmente è stato così difficile ma ora puoi farlo:
var querystring = Arg.url({name: "Mat", state: "CO"});
E opere di lettura:
var name = Arg("name");
o ottenere l'intero lotto:
var params = Arg.all();
e se ti interessa la differenza tra ? query = true
e # hash = true
, puoi usare Arg.query ()
e Arg.hash ()
metodi.
Questo dovrebbe fare il lavoro:
const createQueryParams = params =>
Object.keys(params)
.map(k => `${k}=${encodeURI(params[k])}`)
.join('&');
Esempio:
const params = { name : 'John', postcode: 'W1 2DL'}
const queryParams = createQueryParams(params)
Risultato:
name=John&postcode=W1%202DL
Se stai usando Prototype c'è Form.serialize
Se stai usando jQuery c'è Ajax / serialize
Non conosco alcuna funzione indipendente per raggiungere questo obiettivo, però, ma una ricerca su Google per esso ha rivelato alcune opzioni promettenti se al momento non stai usando una libreria. Se non lo sei, però, dovresti davvero perché sono il paradiso.
Proprio come rivisitare questa domanda di quasi 10 anni. In questa era di programmazione standard, la soluzione migliore è impostare il progetto usando un gestore dipendenze ( npm
). Esiste un intero settore industriale di librerie là fuori che codifica stringhe di query e si occupa di tutti i casi limite. Questo è uno dei più popolari -
ES2017 (ES8)
Utilizzando Object. entry ()
, che restituisce una matrice di coppie [chiave, valore]
dell'oggetto. Ad esempio, per {a: 1, b: 2}
restituirebbe [['a', 1], ['b', 2]]
. Non è supportato (e non lo sarà) solo da IE.
Codice:
const buildURLQuery = obj =>
Object.entries(obj)
.map(pair => pair.map(encodeURIComponent).join('='))
.join('&');
Esempio:
buildURLQuery({name: 'John', gender: 'male'});
Risultato:
"name=John&gender=male"
Una piccola modifica al dattiloscritto:
public encodeData(data: any): string {
return Object.keys(data).map((key) => {
return [key, data[key]].map(encodeURIComponent).join("=");
}).join("&");
}
Questo thread punta ad alcuni codici per sfuggire agli URL in php. C'è escape ()
e unescape ()
che farà la maggior parte del lavoro, ma è necessario aggiungere un paio di cose extra.
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;
}