Node.js中的URL组件编码

时间:2013-09-29 10:54:21

标签: javascript node.js urlencode url-encoding percent-encoding

我想使用node.js发送http请求。我这样做:

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);
    });

当我的path像这样:

/api/mainsms/message/send?project=geoMessage&sender=gis&message=tester_response&recipients=79089145***&sign=2c4135e0f84d2c535846db17b1cec3c6

它的工作。但是当message参数包含任何空格时,例如tester response都会中断。在控制台中,我看到http使用此URL:

  /api/mainsms/message/send?project=geoMessage&sender=gis&message=tester

如何发送空格。或者我只是不能在网址中使用空格?

3 个答案:

答案 0 :(得分:41)

您要找的是URL component encoding

path: '/api/mainsms/message/send?project=' + project + 
'&sender=' + sender + 
'&message=' + message +
'&recipients=' + from + 
'&sign=' + sign

必须更改为

path: '/api/mainsms/message/send?project=' + encodeURIComponent(project) +
'&sender=' + encodeURIComponent(sender) +
'&message=' + encodeURIComponent(message) + 
'&recipients='+encodeURIComponent(from) +
'&sign=' + encodeURIComponent(sign)

注意:

有两种功能可用。 encodeURIencodeURIComponent。当必须对整个URL进行编码时需要使用encodeURI,而在必须对查询字符串参数进行编码时需要使用encodeURIComponent,就像在这种情况下一样。请阅读this answer以获得详尽的解释。

答案 1 :(得分:12)

问题是针对Node.js. Node.js中未定义querystring.escape()。请改用var qs = require('querystring'); qs.escape(stringToBeEscaped); 方法。

class Bar:

    def __init__(self, n):
        self.n = n

class Foo:

    def __init__(self, l):
        self.l = l

x = Bar(2)

# we want x.n to change whenever y.l changes
y = Foo(x.n)

# I'd like x.n to become 3 as a result
y.l += 1

print(x.n)
>>> 2

答案 2 :(得分:0)

最好的方法是使用本机模块QueryString

var qs = require('querystring');
console.log(qs.escape('Hello $ é " \' & ='));
// 'Hello%20%24%20%C3%A9%20%22%20\'%20%26%20%3D'

这是一个原生模块,因此您不必npm install任何事情。