2013-09-29 25 views
12

Chcę wysłać żądanie http za pomocą pliku node.js. Ja:Kodowanie komponentu URL w pliku Node.js

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

kiedy mój path tak:

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

swojej pracy. Ale gdy parametr message zawiera spacje, na przykład tester response, wszystkie zepsuły się. W konsoli widzę, że http używa tego adresu URL:

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

Jak wysłać spacje. Czy po prostu nie mogę używać spacji w adresie URL?

+5

Musisz wykonać kodowanie URL. – thefourtheye

+0

@thefourtheeye: Czy możesz podać przykłady lub linki do przeczytania? –

+2

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent i http://nodejs.org/api/querystring.html – thefourtheye

Odpowiedz

29

To, czego szukasz, to URL component encoding.

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

musi zostać zmieniona na

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

Uwaga:

Istnieją dwie funkcje dostępne. encodeURI i encodeURIComponent. Musisz użyć encodeURI, kiedy musisz zakodować cały URL i encodeURIComponent, gdy parametry ciągu zapytania muszą zostać zakodowane, tak jak w tym przypadku. Przeczytaj obszerne wyjaśnienie na stronie this answer.

+0

Nekromanta tutaj ... Ta odpowiedź jest nieprawidłowa encodeURIComponent jest właściwością okna, więc jest dostępny tylko w przeglądarkach, a nie w Node.js (patrz tytuł). –

+0

@JulienCROUZET Właściwie 'encodeURIComponent' jest również dostępny w Node.js. Dostarcza go v8. Sprawdź [to] (http://ideone.com/q2Ddjp). – thefourtheye

+0

To/może/być dostępne, jest zdefiniowane w ECMA, ale nie ma żadnego istnienia w dokumencie Node.js, więc nie ma LTS lub innych zapewnień dla niego./Dziennik/sposób to moduł zapytania –

0

Najlepszym sposobem jest użycie natywnego modułu QueryString:

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

Jest rodowitym moduł, dzięki czemu nie trzeba npm install niczego.

7

Pytanie dotyczy Node.js. encodeURIcomponent nie jest zdefiniowany w pliku Node.js. Zamiast tego należy użyć metody querystring.escape().