Как создать параметры запроса в Javascript?
-
02-07-2019 - |
Вопрос
Есть ли какой-нибудь способ создать параметры запроса за то, что сделал ПОЛУЧИТЬ запрос в 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);
Другие советы
функциональный
function encodeData(data) {
return Object.keys(data).map(function(key) {
return [key, data[key]].map(encodeURIComponent).join("=");
}).join("&");
}
Забба предоставил в комментарии к принятому в настоящее время ответу предложение, которое для меня является лучшим решением:использование jQuery.param().
Если я использую jQuery.param()
на основе данных, приведенных в исходном вопросе, тогда код будет просто:
const params = jQuery.param({
var1: 'value',
var2: 'value'
});
Переменная params
будет
"var1=value&var2=value"
Для получения более сложных примеров входных и выходных данных смотрите jQuery.param() Документация.
Параметры поиска URLSEARCH расширяется поддержка браузера.
const data = {
var1: 'value1',
var2: 'value2'
};
const searchParams = new URLSearchParams(data);
// searchParams.toString() === 'var1=value1&var2=value2'
Node.js предлагает строка запроса модуль.
const querystring = require('querystring');
const data = {
var1: 'value1',
var2: 'value2'
};
const searchParams = querystring.stringify(data);
// searchParams === 'var1=value1&var2=value2'
Мы только что выпустили 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
Если вы используете Прототип есть Сформировать.сериализовать
Если вы используете jQuery есть Ajax/сериализовать
Однако я не знаю о каких-либо независимых функциях для достижения этой цели, но поиск в Google выявил несколько перспективных вариантов, если вы в данный момент не используете библиотеку.Но если это не так, то вам действительно следует это сделать, потому что они - рай.
Просто хотел бы вернуться к этому вопросу почти 10-летней давности.В нашу эпоху готового программирования лучше всего настроить свой проект с помощью менеджера зависимостей (npm
).Существует целая кустарная индустрия библиотек, которые кодируют строки запросов и заботятся обо всех крайних случаях.Это один из наиболее популярных вариантов -
ES2017 (ES8)
Использование 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"
Небольшая модификация машинописного текста:
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;
}