Як створити параметри запиту в Javascript?


133

Чи є спосіб створити параметри запиту для виконання GET-запиту в JavaScript?

Так само, як і в Python urllib.urlencode(), який у вас є в словнику (або списку з двох кортежів) і створює подібний рядок 'var1=value1&var2=value2'.

Відповіді:


189

Ось вам:

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);

12
Під час ітерації forвикористовуйте hasOwnProperty для забезпечення сумісності.
troelskn

3
@troelskn, хороший момент ... хоча в цьому випадку комусь доведеться розширювати Object.prototype, щоб зламати його, що для цього досить погана ідея.
Shog9

1
@ Shog9 Чому це погана ідея?
Сезар Канаса


Лише невелика деталь, але рет може бути констатований
Алкіс Мавридіс

85

URLSearchParams збільшує підтримку браузера.

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'

1
Однозначно чистий та сучасний підхід. Пізніше ви також можете вільно телефонуватиsearchParams.append(otherData)
кано

81

функціональний

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

1
Хороший! .map () реалізований у JavaScript 1.6, тому майже всі веб-переглядачі, навіть бабусі, підтримують його. Але, як ви здогадаєтесь, IE не окрім IE 9+. Але не хвилюйтеся, є рішення. Джерело: 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?Слід виробляти https://www.something.com/?bloop1=true&bloop2=something?
dylanh724

1
@DylanHunt: Yup…
Пшемек

38

Забба надав у коментарі до прийнятої відповіді пропозицію, що для мене найкраще рішення: використовуйте jQuery.param () .

Якщо я використовую jQuery.param()дані в оригінальному запитанні, то код просто:

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

Змінна paramsбуде

"var1=value&var2=value"

Більш складні приклади, входи та виходи див. У документації на jQuery.param () .


10

Ми щойно випустили 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()методи.


9

Це має зробити цю роботу:

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

1
Пізніше я зрозумів, що це насправді трохи інша версія відповіді @ manav нижче. Але в будь-якому випадку, це все ще може бути кращим для синтаксису ES6.
noego

Перш за все, ви не кодуєте ключі. Також слід використовувати encodeURIComponent()замість encodeURI. Прочитайте про різницю .
Пшемек

9

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"

8

Якщо ви використовуєте прототип , є Form.serialize

Якщо ви використовуєте jQuery , є Ajax / serialize

Я не знаю жодних незалежних функцій для цього, але пошук в Google за ним знайшов кілька перспективних варіантів, якщо ви зараз не використовуєте бібліотеку. Якщо ви цього не зробите, ви справді повинні, тому що це небо.


6
jQuery.param () приймає об'єкт і перетворює його в рядок запиту GET (ця функція краще відповідає питанню).
азуркін

5

Так само, як переглянути це майже 10-річне запитання. У цю епоху позапрограмного програмування найкраще налаштувати проект за допомогою менеджера залежностей ( npm). Існує ціла котеджна галузь бібліотек, які кодують рядки запитів і піклуються про всі кращі справи. Це одна з найпопулярніших -

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


Дуже непевна відповідь.
masterxilo

2

Невелика модифікація машинопису:

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

-11

Цей потік вказує на деякий код для втечі 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;
}

3
encodeURIComponent обробляє це і неправильно використовує + для пробілу.
AnthonyWJones
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.