Есть ли способ создать параметры запроса для выполнения запроса GET в JavaScript?
Как и в Python urllib.urlencode()
, который берет словарь (или список из двух кортежей) и создает строку вроде 'var1=value1&var2=value2'
.
Есть ли способ создать параметры запроса для выполнения запроса GET в JavaScript?
Как и в Python urllib.urlencode()
, который берет словарь (или список из двух кортежей) и создает строку вроде 'var1=value1&var2=value2'
.
Ответы:
Ну вот:
function encodeQueryData(data) {
const ret = [];
for (let d in data)
ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
return ret.join('&');
}
Использование:
const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);
URLSearchParams имеет все большую поддержку браузеров.
const data = {
var1: 'value1',
var2: 'value2'
};
const searchParams = new URLSearchParams(data);
// searchParams.toString() === 'var1=value1&var2=value2'
Node.js предлагает модуль querystring .
const querystring = require('querystring');
const data = {
var1: 'value1',
var2: 'value2'
};
const searchParams = querystring.stringify(data);
// searchParams === 'var1=value1&var2=value2'
searchParams.append(otherData)
функциональная
function encodeData(data) {
return Object.keys(data).map(function(key) {
return [key, data[key]].map(encodeURIComponent).join("=");
}).join("&");
}
var data = { bloop1: true, bloop2: "something" }; var url = "https://something.com/?"; var params = encodeData(data); var finalUrl = url + params; // Is this the right use?
Должен производить https://www.something.com/?bloop1=true&bloop2=something
?
Забба предоставил в комментарии к принятому в настоящее время ответу предложение, которое для меня является лучшим решением: используйте jQuery.param () .
Если я использую jQuery.param()
данные в исходном вопросе, тогда код будет просто:
const params = jQuery.param({
var1: 'value',
var2: 'value'
});
Переменная params
будет
"var1=value&var2=value"
Более сложные примеры, входные и выходные данные см. В документации jQuery.param () .
Мы только что выпустили arg.js , проект, нацеленный на решение этой проблемы раз и навсегда. Традиционно это было так сложно, но теперь вы можете:
var querystring = Arg.url({name: "Mat", state: "CO"});
И чтение работает:
var name = Arg("name");
или получить всю партию:
var params = Arg.all();
и если вы заботитесь о разнице между ?query=true
и #hash=true
после этого вы можете использовать Arg.query()
и Arg.hash()
методы.
Это должно сработать:
const createQueryParams = params =>
Object.keys(params)
.map(k => `${k}=${encodeURI(params[k])}`)
.join('&');
Пример:
const params = { name : 'John', postcode: 'W1 2DL'}
const queryParams = createQueryParams(params)
Результат:
name=John&postcode=W1%202DL
encodeURIComponent()
вместо encodeURI
. О разнице читайте .
Используя Object.entries()
, который возвращает массив [key, value]
пар объектов . Например, за {a: 1, b: 2}
это вернется [['a', 1], ['b', 2]]
. Он не поддерживается (и не будет) только IE.
const buildURLQuery = obj =>
Object.entries(obj)
.map(pair => pair.map(encodeURIComponent).join('='))
.join('&');
buildURLQuery({name: 'John', gender: 'male'});
"name=John&gender=male"
Если вы используете Prototype, есть Form.serialize
Если вы используете jQuery, есть Ajax / serialize
Я не знаю каких-либо независимых функций для этого, но поиск в Google обнаружил некоторые многообещающие варианты, если вы в настоящее время не используете библиотеку. Если нет, то действительно должны, потому что они рай.
Просто хотелось бы вернуться к этому вопросу, которому уже почти 10 лет. В эту эпоху готового программирования лучше всего настроить свой проект с помощью диспетчера зависимостей ( npm
). Существует целая индустрия библиотек, которые кодируют строки запроса и заботятся обо всех крайних случаях. Это один из самых популярных -
Небольшая модификация машинописного текста:
public encodeData(data: any): string {
return Object.keys(data).map((key) => {
return [key, data[key]].map(encodeURIComponent).join("=");
}).join("&");
}
Этот поток указывает на некоторый код для экранирования URL-адресов в php. Есть escape()
и unescape()
который сделает большую часть работы, но вам нужно добавить пару дополнительных вещей.
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;
}
for
использованием hasOwnProperty для обеспечения взаимодействия.