Javascript'te sorgu parametreleri nasıl oluşturulur?


133

JavaScript'te GET isteği yapmak için sorgu parametrelerini oluşturmanın herhangi bir yolu var mı ?

Tıpkı Python'da olduğu gibi, urllib.urlencode()bir sözlüğü (veya iki demet listesini) alan ve benzeri bir dize oluşturan 'var1=value1&var2=value2'.

Yanıtlar:


189

Hadi bakalım:

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

Kullanımı:

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

12
İle yineleme yaparken for, birlikte çalışabilirliği sağlamak için hasOwnProperty kullanın.
troelskn

3
@troelskn, iyi nokta ... Bu durumda, birinin onu kırmak için Object.prototype'ı genişletmesi gerekecek, bu da başlamak için oldukça kötü bir fikir.
Shog9

1
@ Shog9 Neden kötü bir fikir?
Cesar Canassa


Sadece küçük bir ayrıntı, ancak ret sabit olabilir
Alkis Mavridis

86

URLSearchParams , artan tarayıcı desteğine sahiptir.

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

const searchParams = new URLSearchParams(data);

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

Node.js, sorgu dizisi modülünü sunar .

const querystring = require('querystring');

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

const searchParams = querystring.stringify(data);

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

1
Kesinlikle temiz ve modern yaklaşım. Ayrıca daha sonra özgürce de arayabilirsinizsearchParams.append(otherData)
kano

81

fonksiyonel

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

1
Güzel bir! .map () JavaScript 1.6'da uygulanmıştır, bu nedenle neredeyse tüm tarayıcılar, büyükanne olanlar bile bunu destekler. Ancak tahmin edebileceğiniz gibi IE, IE 9+ dışında değil. Ancak endişelenmeyin, bir çözüm var. Kaynak: 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?Üretmeli https://www.something.com/?bloop1=true&bloop2=somethingmi?
dylanh724

1
@DylanHunt: Evet…
Przemek

38

Zabba , şu anda kabul edilen cevapla ilgili bir yorumda, benim için en iyi çözümün benim için en iyi çözüm olduğuna dair bir öneri sundu : jQuery.param () kullanın .

jQuery.param()Orijinal sorudaki veriler üzerinde kullanırsam , kod basitçe:

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

Değişken paramsolacak

"var1=value&var2=value"

Daha karmaşık örnekler, girdiler ve çıktılar için jQuery.param () belgelerine bakın.


10

Bu sorunu kesin olarak çözmeyi amaçlayan bir proje olan arg.js'yi kısa süre önce yayınladık . Geleneksel olarak çok zordu ama şimdi şunları yapabilirsiniz:

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

Ve okuma işleri:

var name = Arg("name");

veya hepsini almak:

var params = Arg.all();

ve arasındaki fark veriyorsan ?query=trueve #hash=trueardından kullanmak olabilir Arg.query()ve Arg.hash()yöntemler.


9

Bu işi yapmalı:

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

Misal:

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

Sonuç:

name=John&postcode=W1%202DL

1
Daha sonra bunun aslında aşağıdaki @ manav yanıtının biraz farklı bir versiyonu olduğunu fark ettim. Ama yine de ES6 sözdizimi için tercih edilebilir.
noego

Her şeyden önce, anahtarları kodlamıyorsunuz. Ayrıca, encodeURIComponent()yerine kullanmalısınız encodeURI. Farkı okuyun .
Przemek

9

ES2017 (ES8)

Kullanmak Object.entries(), bir nesne [key, value]çiftleri dizisi döndürür . Örneğin, {a: 1, b: 2}geri dönecekti [['a', 1], ['b', 2]]. Yalnızca IE tarafından desteklenmez (ve desteklenmez).

Kod:

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

Misal:

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

Sonuç:

"name=John&gender=male"

8

Eğer kullanıyorsanız Prototype var Form.serialize

JQuery kullanıyorsanız , Ajax / serialize var

Bununla birlikte, bunu başarmak için herhangi bir bağımsız işlev bilmiyorum, ancak bunun için bir Google araması, şu anda bir kitaplık kullanmıyorsanız bazı umut verici seçenekler ortaya çıkardı. Eğer değilseniz, gerçekten yapmalısınız çünkü onlar cennettir.


6
jQuery.param () nesneyi alır ve GET sorgu dizesine dönüştürür (bu işlev soruyla daha iyi eşleşir).
azurkin

5

Neredeyse 10 yıllık bu soruyu tekrar gözden geçirmek gibi. Kullanıma hazır programlama çağında, en iyi seçeneğiniz projenizi bir bağımlılık yöneticisi ( npm) kullanarak oluşturmaktır . Sorgu dizelerini kodlayan ve tüm uç durumlarla ilgilenen koca bir kütüphane endüstrisi var. Bu en popüler olanlardan biri -

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


Hiç belirsiz cevap.
masterxilo

2

Yazı tipinde küçük bir değişiklik:

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

-11

Bu iş parçacığı php'de URL'lerden kaçmak için bazı koda işaret ediyor. Var escape()ve unescape()işin çoğunu yapacak, ancak birkaç ek şey eklemeniz gerekiyor.

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 bunu ele alır ve boşluk için hatalı şekilde + kullanmaz.
AnthonyWJones
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.