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'.

cnu
sumber

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);
Shog9
sumber
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
@Cesar, lihat: stackoverflow.com/questions/3832617/... **
Shog9
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'
Andrew Palmer
sumber
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("&");
}   
Manav
sumber
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 () .

Kirby
sumber
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.

Mat Ryer
sumber
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
noego
sumber
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"
Przemek
sumber
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.

Paolo Bergantino
sumber
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

pscl
sumber
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("&");
  }
Clayton KN Passos
sumber
-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;
}
Kibbee
sumber
3
encodeURIComponent menangani ini dan tidak salah menggunakan + untuk spasi.
AnthonyWJones