web-dev-qa-db-ja.com

Node.jsでのURLコンポーネントエンコーディング

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にスペースを使用できませんか?

17
Kliver Max

探しているのは RLコンポーネントエンコーディング です。

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)

注:

使用可能な機能は2つあります。 encodeURI および encodeURIComponent 。この場合のように、URL全体をエンコードする必要がある場合はencodeURIを使用し、クエリ文字列パラメーターをエンコードする必要がある場合はencodeURIComponentを使用する必要があります。詳細な説明については、 この回答 をお読みください。

42
thefourtheye

質問はNode.jsです。 encodeURIcomponentはNode.jsで定義されていません。代わりにquerystring.escape()メソッドを使用してください。

var qs = require('querystring');
qs.escape(stringToBeEscaped);
14
David Welborn

最適な方法は、ネイティブモジュール 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何でも。

1
Julien CROUZET