Bagaimana cara membuat parameter kueri dalam Javascript?


133

Apakah ada cara untuk membuat parameter kueri untuk melakukan permintaan GET dalam JavaScript?

Sama seperti di Python yang Anda miliki urllib.urlencode(), yang menggunakan kamus (atau daftar dua tupel) dan membuat string seperti 'var1=value1&var2=value2'.

Jawaban:


189

Ini dia:

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

Pemakaian:

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

12
Ketika iterasi dengan for, gunakan hasOwnProperty untuk memastikan interoperabilitas.
troelskn

3
@troelskn, poin bagus ... walaupun dalam kasus ini, seseorang harus memperluas Object.prototype untuk menghentikannya, yang merupakan ide yang sangat buruk untuk memulai.
Shog9

1
@ Shog9 Mengapa ini ide yang buruk?
Cesar Canassa


Hanya detail kecil, tapi ret bisa jadi const
Alkis Mavridis

85

URLSearchParams telah meningkatkan dukungan browser.

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

const searchParams = new URLSearchParams(data);

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

Node.js menawarkan modul querystring .

const querystring = require('querystring');

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

const searchParams = querystring.stringify(data);

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

1
Jelas pendekatan yang bersih dan modern. Anda juga dapat dengan bebas meneleponsearchParams.append(otherData)
kano

81

fungsional

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

1
Yang bagus! .map () telah diimplementasikan dalam JavaScript 1.6 sehingga hampir semua browser, bahkan yang nenek mendukungnya. Tetapi seperti yang dapat Anda duga, IE tidak kecuali IE 9+. Tapi jangan khawatir, ada solusinya. Sumber: 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?Haruskah menghasilkan https://www.something.com/?bloop1=true&bloop2=something?
dylanh724

1
@DylanHunt: Yup…
Przemek

38

Zabba telah memberikan komentar tentang jawaban yang saat ini diterima sebagai saran bahwa bagi saya adalah solusi terbaik: gunakan jQuery.param () .

Jika saya menggunakan jQuery.param()data dalam pertanyaan awal, maka kodenya adalah:

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

Variabelnya paramsadalah

"var1=value&var2=value"

Untuk contoh yang lebih rumit, input dan output, lihat dokumentasi jQuery.param () .


10

Kami baru saja merilis arg.js , sebuah proyek yang ditujukan untuk menyelesaikan masalah ini untuk selamanya. Secara tradisional sudah sangat sulit tetapi sekarang Anda dapat melakukannya:

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

Dan membaca bekerja:

var name = Arg("name");

atau mendapatkan semuanya:

var params = Arg.all();

dan jika Anda peduli tentang perbedaan antara ?query=truedan #hash=truekemudian Anda dapat menggunakan Arg.query()dan Arg.hash()metode.


9

Ini harus melakukan pekerjaan:

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

Contoh:

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

Hasil:

name=John&postcode=W1%202DL

1
Saya kemudian menyadari bahwa sebenarnya ini adalah versi yang sedikit berbeda dari respons @ manav di bawah ini. Tapi bagaimanapun, itu masih bisa lebih disukai untuk sintaks ES6.
noego

Pertama-tama, Anda tidak menyandikan kunci. Juga, Anda harus menggunakan encodeURIComponent()bukan encodeURI. Baca tentang perbedaannya .
Przemek

9

ES2017 (ES8)

Memanfaatkan Object.entries(), yang mengembalikan array [key, value]pasangan objek. Misalnya, untuk {a: 1, b: 2}itu akan kembali [['a', 1], ['b', 2]]. Itu tidak didukung (dan tidak akan) hanya oleh IE.

Kode:

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

Contoh:

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

Hasil:

"name=John&gender=male"

8

Jika Anda menggunakan Prototipe ada Form.serialize

Jika Anda menggunakan jQuery ada Ajax / serialize

Saya tidak tahu ada fungsi independen untuk melakukan ini, tetapi, pencarian google untuk itu muncul beberapa opsi yang menjanjikan jika Anda saat ini tidak menggunakan perpustakaan. Jika Anda tidak, Anda harus melakukannya karena itu surga.


6
jQuery.param () mengambil objek dan mengubahnya menjadi MENDAPATKAN string kueri (fungsi ini lebih cocok dengan pertanyaan).
azurkin

5

Hanya ingin meninjau kembali pertanyaan berusia hampir 10 tahun ini. Di era pemrograman di luar rak, taruhan terbaik Anda adalah mengatur proyek Anda menggunakan dependency manager ( npm). Ada seluruh industri rumahan perpustakaan di luar sana yang menyandikan string kueri dan menangani semua kasus tepi. Ini adalah salah satu yang lebih populer -

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


Jawaban yang sangat tidak spesifik.
masterxilo

2

Sedikit modifikasi pada naskah:

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

-11

Utas ini menunjuk ke beberapa kode untuk keluar dari URL di php. Ada escape()dan unescape()yang akan melakukan sebagian besar pekerjaan, tetapi Anda perlu menambahkan beberapa hal tambahan.

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 menangani ini dan tidak salah menggunakan + untuk spasi.
AnthonyWJones
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.