Is there any way to create the query parameters for doing a GET request in JavaScript?
Just like in Python you have urllib.urlencode()
, which takes in a dictionary (or list of two tuples) and creates a string like 'var1=value1&var2=value2'
.
Is there any way to create the query parameters for doing a GET request in JavaScript?
Just like in Python you have urllib.urlencode()
, which takes in a dictionary (or list of two tuples) and creates a string like 'var1=value1&var2=value2'
.
Here you go:
function encodeQueryData(data) {
const ret = [];
for (let d in data)
ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
return ret.join('&');
}
Usage:
const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);
for
, use hasOwnProperty to ensure interoperability. –
Advertise encodeQueryData({foo:{bar:123}})
returns foo=%5Bobject%20Object%5D
, but the correct return value would be foo%5Bbar%5D=123
–
Benn function encodeQueryData(data) { return new URLSearchParams(data).toString(); }
–
Marmara URLSearchParams has increasing browser support.
const data = {
var1: 'value1',
var2: 'value2'
};
const searchParams = new URLSearchParams(data);
// searchParams.toString() === 'var1=value1&var2=value2'
Node.js offers the querystring module.
const querystring = require('querystring');
const data = {
var1: 'value1',
var2: 'value2'
};
const searchParams = querystring.stringify(data);
// searchParams === 'var1=value1&var2=value2'
searchParams.append(otherData)
–
Manley new URLSearchParams({ abc: 'a b c' }).toString()
result in 'abc=a+b+c'
–
Fajardo ?
only when searchParams
are not blank. –
Egeria Here you go:
function encodeQueryData(data) {
const ret = [];
for (let d in data)
ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
return ret.join('&');
}
Usage:
const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);
for
, use hasOwnProperty to ensure interoperability. –
Advertise encodeQueryData({foo:{bar:123}})
returns foo=%5Bobject%20Object%5D
, but the correct return value would be foo%5Bbar%5D=123
–
Benn function encodeQueryData(data) { return new URLSearchParams(data).toString(); }
–
Marmara functional
function encodeData(data) {
return Object.keys(data).map(function(key) {
return [key, data[key]].map(encodeURIComponent).join("=");
}).join("&");
}
var data = { bloop1: true, bloop2: "something" }; var url = "https://something.com/?"; var params = encodeData(data); var finalUrl = url + params; // Is this the right use?
Should produce https://www.something.com/?bloop1=true&bloop2=something
? –
Farreaching encodeData({foo:{bar:123}})
returns foo=%5Bobject%20Object%5D
, but the correct return value would be foo%5Bbar%5D=123
–
Benn Zabba has provided in a comment on the currently accepted answer a suggestion that to me is the best solution: use jQuery.param().
If I use jQuery.param()
on the data in the original question, then the code is simply:
const params = jQuery.param({
var1: 'value',
var2: 'value'
});
The variable params
will be
"var1=value&var2=value"
For more complicated examples, inputs and outputs, see the jQuery.param() documentation.
The built-in URL
class provides a convenient interface for creating and parsing URLs.
There are no networking methods that require exactly a URL
object, strings are good enough. So technically we don’t have to use URL
. But sometimes it can be really helpful.
👇 Example
let url = new URL("https://google.com/search");
url.searchParams.set('var1', "value1");
url.searchParams.set('var2', "value2");
url.searchParams.set('var3', "value3");
url.searchParams.set('var4', "value4 has spaces");
console.log(url)
url
object to string with url.toString()
–
Aboveground const url = new URL("/some-route");
throws "'URL': Invalid URL" error. –
Indignant Making use of Object.entries()
, which returns an array of object's [key, value]
pairs. For example, for {a: 1, b: 2}
it would return [['a', 1], ['b', 2]]
. It is not supported (and won't be) only by IE.
const buildURLQuery = obj =>
Object.entries(obj)
.map(pair => pair.map(encodeURIComponent).join('='))
.join('&');
buildURLQuery({name: 'John', gender: 'male'});
"name=John&gender=male"
We've just released arg.js, a project aimed at solving this problem once and for all. It's traditionally been so difficult but now you can do:
var querystring = Arg.url({name: "Mat", state: "CO"});
And reading works:
var name = Arg("name");
or getting the whole lot:
var params = Arg.all();
and if you care about the difference between ?query=true
and #hash=true
then you can use the Arg.query()
and Arg.hash()
methods.
This should do the job:
const createQueryParams = params =>
Object.keys(params)
.map(k => `${k}=${encodeURI(params[k])}`)
.join('&');
Example:
const params = { name : 'John', postcode: 'W1 2DL'}
const queryParams = createQueryParams(params)
Result:
name=John&postcode=W1%202DL
encodeURIComponent()
instead of encodeURI
. Read about the difference. –
Jasen If you are using Prototype there is Form.serialize
If you are using jQuery there is Ajax/serialize
I do not know of any independent functions to accomplish this, though, but a google search for it turned up some promising options if you aren't currently using a library. If you're not, though, you really should because they are heaven.
A little modification to typescript:
public encodeData(data: any): string {
return Object.keys(data).map((key) => {
return [key, data[key]].map(encodeURIComponent).join("=");
}).join("&");
}
Just like to revisit this almost 10 year old question. In this era of off-the-shelf programming, your best bet is to set your project up using a dependency manager (npm
). There is an entire cottage industry of libraries out there that encode query strings and take care of all the edge cases. This is one of the more popular ones -
const base = "https://www.facebook.com"
const path = '/v15.0/dialog/oauth'
const params = new URLSearchParams({
client_id: clientID,
redirect_uri: redirectUri,
state: randomState,
})
const url = new URL(`${path}?${params.toString()}`, base)
Here's an example to create query parameters and build URL from base using only JavaScript built-in constructor. This is part of Facebook Login implementation in manual approach.
According to URLSearchParams doc's example, there's a line
const new_url = new URL(`${url.origin}${url.pathname}?${new_params}`);
and I've followed that practice.
This is by far the most standardized way to build URL I believe.
I was a bit surprised that JavaScript doesn't supports query
or fragment
arguments in thier URL
constructor still in 2023, despite It's definately worth having that.
Build URL with parameters in JavaScript
Construct URL without parameters
const apiEndPoint = new URL('https://geocode.maps.co/reverse');
Organise parameters in object form
const parameters = {
lat: 52.508,
lon: 13.381
}
Construct search parameters from object
const searchParams = new URLSearchParams(parameters)
Add search parameters to URL
apiEndPoint.search = searchParams
Final URL
const finalURL = apiEndPoint.toString()
Print completed URL on console
console.log(finalURL)
Here is an example:
let my_url = new URL("https://stackoverflow.com")
my_url.pathname = "/questions"
const parameters = {
title: "just",
body: 'test'
}
Object.entries(parameters).forEach(([name, value]) => my_url.searchParams.set(name, value))
console.log(my_url.href)
I have improved the function of shog9`s to handle array values
function encodeQueryData(data) {
const ret = [];
for (let d in data) {
if (typeof data[d] === 'object' || typeof data[d] === 'array') {
for (let arrD in data[d]) {
ret.push(`${encodeURIComponent(d)}[]=${encodeURIComponent(data[d][arrD])}`)
}
} else if (typeof data[d] === 'null' || typeof data[d] === 'undefined') {
ret.push(encodeURIComponent(d))
} else {
ret.push(`${encodeURIComponent(d)}=${encodeURIComponent(data[d])}`)
}
}
return ret.join('&');
}
let data = {
user: 'Mark'
fruits: ['apple', 'banana']
}
encodeQueryData(data) // user=Mark&fruits[]=apple&fruits[]=banana
encodeQueryData({foo:{bar:123}})
returns foo[]=123
, but the correct return value would be foo%5Bbar%5D=123
–
Benn By using queryencoder, you can have some nice-to-have options, such custom date formatters, nested objects and decide if a val: true
will be just value
or value=true
.
const { encode } = require('queryencoder');
const object = {
date: new Date('1999-04-23')
};
// The result is 'date=1999-04-23'
const queryUrl = encode(object, {
dateParser: date => date.toISOString().slice(0, 10)
});
A slightly improved version that removes empty values from the result:
function createQueryParams (params) {
return Object.keys(params).filter(k => params[k])
.map(k => `${k}=${encodeURIComponent(params[k])}`)
.join('&');
}
This thread points to some code for escaping URLs in php. There's escape()
and unescape()
which will do most of the work, but the you need add a couple extra things.
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;
}
© 2022 - 2024 — McMap. All rights reserved.