URL component encoding in Node.js


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:


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:


How to send spaces. Or i just can't use spaces in url?

Problem courtesy of: Kliver Max


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)


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.

Solution courtesy of: thefourtheye


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.

Discussion courtesy of: Julien CROUZET

The question is for Node.js. encodeURIcomponent is not defined in Node.js. Use the querystring.escape() method instead.

var qs = require('querystring');
Discussion courtesy of: David Welborn

This recipe can be found in it's original form on Stack Over Flow.