Reputation: 5299
I want to send http request using node.js. I do:
http = require('http');
var options = {
host: 'www.mainsms.ru',
path: '/api/mainsms/message/send?project='+project+'&sender='+sender+'&message='+message+'&recipients='+from+'&sign='+sign
};
http.get(options, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
}).on('error', function(e) {
console.log('ERROR: ' + e.message);
});
When my path
like this:
/api/mainsms/message/send?project=geoMessage&sender=gis&message=tester_response&recipients=79089145***&sign=2c4135e0f84d2c535846db17b1cec3c6
Its work. But when message
parameter contains any spaces for example tester response
all broke. And in console i see that http use this url:
/api/mainsms/message/send?project=geoMessage&sender=gis&message=tester
How to send spaces. Or i just can't use spaces in url?
Upvotes: 23
Views: 52993
Reputation: 20851
MDN encodeURI() Documentation...
function fixedEncodeURI(str) { return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']'); }
MDN encodeURIComponent() Documentation...
function fixedEncodeURIComponent(str) { return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { return '%' + c.charCodeAt(0).toString(16); }); }
It is really not recommended to use encodeURI()
and encodeURIComponent()
, as they are insufficient to properly handle URI or URL encoding directly. Just like at this piece...
'&message=' + encodeURIComponent(message) +
Let's say that the message
var is set to this: "Hello, world! (Really hello!)"
. So what is that evaluated to?
console.log('&message=' + encodeURIComponent("Hello, world! (Really hello!)"));
Output:
&message=Hello%2C%20world!%20(Really%20hello!)
That's not right! Why weren't (
and )
encoded? After all, according to RFC3986, Section 2.2: Reserved Characters...
If data for a URI component would conflict with a reserved character's purpose as a delimiter, then the conflicting data must be percent-encoded before the URI is formed.
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Parens are a sub-delim, but they are not being escaped by encodeURI()
or encodeURIComponent()
.
Upvotes: 0
Reputation: 374
The question is for Node.js. encodeURIcomponent
is not defined in Node.js. Use the querystring.escape()
method instead.
var qs = require('querystring');
qs.escape(stringToBeEscaped);
Upvotes: 23
Reputation: 764
The best way is to use the native module QueryString :
var qs = require('querystring');
console.log(qs.escape('Hello $ é " \' & ='));
// 'Hello%20%24%20%C3%A9%20%22%20\'%20%26%20%3D'
This is a native module, so you don't have to npm install
anything.
Upvotes: 4
Reputation: 239443
What you are looking for is called URL component encoding.
path: '/api/mainsms/message/send?project=' + project +
'&sender=' + sender +
'&message=' + message +
'&recipients=' + from +
'&sign=' + sign
has to be changed to
path: '/api/mainsms/message/send?project=' + encodeURIComponent(project) +
'&sender=' + encodeURIComponent(sender) +
'&message=' + encodeURIComponent(message) +
'&recipients='+encodeURIComponent(from) +
'&sign=' + encodeURIComponent(sign)
Note:
There are two functions available. encodeURI
and encodeURIComponent
. You need to use encodeURI
when you have to encode the entire URL and encodeURIComponent
when the query string parameters have to be encoded, like in this case. Please read this answer for extensive explanation.
Upvotes: 50