Làm cách nào để tạo tham số truy vấn trong Javascript?


132

Có cách nào để tạo các tham số truy vấn để thực hiện yêu cầu GET trong JavaScript không?

Giống như trong Python bạn có urllib.urlencode(), nó lấy một từ điển (hoặc danh sách hai bộ dữ liệu) và tạo ra một chuỗi như thế nào 'var1=value1&var2=value2'.

Câu trả lời:


189

Ở đây bạn đi:

function encodeQueryData(data) {
   const ret = [];
   for (let d in data)
     ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
   return ret.join('&');
}

Sử dụng:

const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);

12
Khi lặp lại for, sử dụng hasOwnProperty để đảm bảo khả năng tương tác.
troelskn

3
@troelskn, điểm tốt ... mặc dù trong trường hợp này, ai đó sẽ phải mở rộng Object.prototype để phá vỡ nó, đó là một ý tưởng khá tồi để bắt đầu.
Shog9

1
@ Shog9 Tại sao nó là một ideia xấu?
Cesar Canassa


Chỉ là một chi tiết nhỏ, nhưng ret có thể là const
Alkis Mavridis

84

URLSearchParams đã tăng hỗ trợ trình duyệt.

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = new URLSearchParams(data);

// searchParams.toString() === 'var1=value1&var2=value2'

Node.js cung cấp mô-đun chuỗi truy vấn .

const querystring = require('querystring');

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = querystring.stringify(data);

// searchParams === 'var1=value1&var2=value2'

1
Chắc chắn là cách tiếp cận sạch sẽ và hiện đại. Sau này bạn cũng có thể tự do gọisearchParams.append(otherData)
kano

81

chức năng

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

1
Đẹp quá .map () đã được triển khai trong JavaScript 1.6 nên hầu như tất cả các trình duyệt, ngay cả các trình duyệt đều hỗ trợ nó. Nhưng như bạn có thể đoán IE không ngoại trừ IE 9+. Nhưng đừng lo lắng, có một cách giải quyết. Nguồn: developer.mozilla.org/en-US/docs/JavaScript/Reference/
Kẻ

var data = { bloop1: true, bloop2: "something" }; var url = "https://something.com/?"; var params = encodeData(data); var finalUrl = url + params; // Is this the right use?Có nên sản xuất https://www.something.com/?bloop1=true&bloop2=something?
dylanh724

1
@DylanHunt: Yup từ
Przemek

38

Zabba đã cung cấp trong một nhận xét về câu trả lời hiện được chấp nhận một gợi ý rằng với tôi là giải pháp tốt nhất: sử dụng jQuery.param () .

Nếu tôi sử dụng jQuery.param()dữ liệu trong câu hỏi ban đầu, thì mã chỉ đơn giản là:

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

Biến paramssẽ là

"var1=value&var2=value"

Để biết các ví dụ, đầu vào và đầu ra phức tạp hơn, hãy xem tài liệu jQuery.param () .


10

Chúng tôi vừa phát hành arg.js , một dự án nhằm giải quyết vấn đề này một lần và mãi mãi. Theo truyền thống, nó rất khó khăn nhưng bây giờ bạn có thể làm:

var querystring = Arg.url({name: "Mat", state: "CO"});

Và đọc tác phẩm:

var name = Arg("name");

hoặc nhận được toàn bộ lô:

var params = Arg.all();

và nếu bạn quan tâm đến sự khác biệt giữa ?query=true#hash=truesau đó bạn có thể sử dụng Arg.query()Arg.hash()phương thức.


9

Điều này sẽ làm công việc:

const createQueryParams = params => 
      Object.keys(params)
            .map(k => `${k}=${encodeURI(params[k])}`)
            .join('&');

Thí dụ:

const params = { name : 'John', postcode: 'W1 2DL'}
const queryParams = createQueryParams(params)

Kết quả:

name=John&postcode=W1%202DL

1
Sau đó tôi đã nhận ra rằng đó thực sự là một phiên bản hơi khác của phản hồi của @ manav bên dưới. Nhưng dù sao, nó vẫn có thể thích hợp hơn cho cú pháp ES6.
noego 16/03/18

Trước hết, bạn không mã hóa các khóa. Ngoài ra, bạn nên sử dụng encodeURIComponent()thay vì encodeURI. Đọc về sự khác biệt .
Przemek

9

ES2017 (ES8)

Việc sử dụng Object.entries(), trả về một mảng các [key, value]cặp đối tượng . Ví dụ, cho {a: 1, b: 2}nó sẽ trở lại [['a', 1], ['b', 2]]. Nó không chỉ được hỗ trợ (và sẽ không) bởi IE.

Mã số:

const buildURLQuery = obj =>
      Object.entries(obj)
            .map(pair => pair.map(encodeURIComponent).join('='))
            .join('&');

Thí dụ:

buildURLQuery({name: 'John', gender: 'male'});

Kết quả:

"name=John&gender=male"

8

Nếu bạn đang sử dụng Prototype,Form.serialize

Nếu bạn đang sử dụng jQuery,Ajax / serialize

Mặc dù vậy, tôi không biết bất kỳ chức năng độc lập nào để thực hiện việc này, nhưng một tìm kiếm google cho nó đã đưa ra một số tùy chọn đầy hứa hẹn nếu bạn hiện không sử dụng thư viện. Tuy nhiên, nếu bạn không, bạn thực sự nên bởi vì họ là thiên đường.


5
jQuery.param () lấy đối tượng và chuyển đổi nó thành chuỗi truy vấn GET (hàm này phù hợp hơn với câu hỏi).
azurkin

5

Chỉ muốn xem lại câu hỏi gần 10 năm tuổi này. Trong thời đại lập trình sẵn có này, cách tốt nhất của bạn là thiết lập dự án của bạn bằng cách sử dụng trình quản lý phụ thuộc ( npm). Có một toàn bộ ngành công nghiệp thư viện ngoài kia mã hóa các chuỗi truy vấn và xử lý tất cả các trường hợp cạnh. Đây là một trong những phổ biến hơn -

https://www.npmjs.com/package/query- chuỗi


Câu trả lời rất không cụ thể.
masterxilo

2

Một chút sửa đổi cho bản thảo:

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

-11

Chủ đề này chỉ ra một số mã để thoát URL trong php. Có escape()unescape()sẽ làm hầu hết công việc, nhưng bạn cần thêm một vài điều nữa.

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 xử lý việc này và không sử dụng + không chính xác cho một khoảng trắng.
AnthonyWJones
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.