22

我想使用 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

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

4

4 回答 4

48

您要查找的内容称为URL 组件编码

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)

笔记:

有两个功能可用。encodeURIencodeURIComponentencodeURI当您必须对整个 URL 进行编码以及encodeURIComponent必须对查询字符串参数进行编码时,您需要使用,例如在这种情况下。请阅读此答案以获得广泛的解释。

于 2013-09-29T11:08:41.010 回答
21

问题是针对 Node.js。encodeURIcomponent在 Node.js 中没有定义。请改用该querystring.escape()方法。

var qs = require('querystring');
qs.escape(stringToBeEscaped);
于 2016-02-09T23:10:49.550 回答
4

最好的方法是使用本机模块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任何事情。

于 2015-12-09T19:55:11.990 回答
-1

TLDR:使用 fixedEncodeURI() 和 fixedEncodeURIComponent()

MDN encodeURI() 文档...

function fixedEncodeURI(str) {
   return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}

MDN encodeURIComponent() 文档...

function fixedEncodeURIComponent(str) {
 return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
   return '%' + c.charCodeAt(0).toString(16);
 });
}

为什么不使用 encodeURI() 和 encodeURIComponent()

真的不建议使用encodeURI()and encodeURIComponent(),因为它们不足以直接正确处理 URI 或 URL 编码。就像在这片...

'&message=' + encodeURIComponent(message) + 

假设messagevar 设置为此:"Hello, world! (Really hello!)"。那么这是评估什么?

console.log('&message=' + encodeURIComponent("Hello, world! (Really hello!)"));

输出:

&message=Hello%2C%20world!%20(Really%20hello!)

那是不对的!为什么没有()编码?毕竟,根据RFC3986,第 2.2 节:保留字符...

如果 URI 组件的数据与保留字符作为分隔符的用途发生冲突,则必须在形成 URI 之前对冲突数据进行百分比编码。

子分隔符=“!” /“$”/“&”/“'”/“(”/“)”/“*”/“+”/“”/“;” /“=”

Parens 是一个 sub-delim,但它们没有被encodeURI()or转义encodeURIComponent()

于 2022-02-10T18:41:05.043 回答