2013-06-03 28 views
44

Mam aplikację Node.js, która jest klientem http (w tej chwili). Więc robię:node.js http 'get' request z parametrami ciągu zapytania

var query = require('querystring').stringify(propertiesObject); 
http.get(url + query, function(res) { 
    console.log("Got response: " + res.statusCode); 
}).on('error', function(e) { 
    console.log("Got error: " + e.message); 
}); 

Wydaje się, że jest to wystarczająco dobry sposób, aby to osiągnąć. Jednak jestem nieco urażony, że musiałem zrobić krok url + query. Powinien to być enkapsulowany przez wspólną bibliotekę, ale nie widzę tego jeszcze w bibliotece węzła http i nie jestem pewien, jaki standardowy pakiet npm mógłby to zrobić. Czy istnieje rozsądnie szeroko stosowany sposób, który jest lepszy?

url.format Metoda zapisuje pracę nad budowaniem własnego adresu URL. Ale najlepiej, jeśli prośba będzie wyższa niż ta również.

+0

http://nodejs.org/api/url.html#url_url_format_urlobj – SLaks

+0

https://nodejs.org /api/querystring.html – velop

Odpowiedz

103

Sprawdź moduł request.

Jest bardziej w pełni funkcjonalny niż wbudowany klient HTTP węzła.

var request = require('request'); 

var propertiesObject = { field1:'test1', field2:'test2' }; 

request({url:url, qs:propertiesObject}, function(err, response, body) { 
    if(err) { console.log(err); return; } 
    console.log("Get response: " + response.statusCode); 
}); 
+0

Jak wyglądałby typowy obiekt properties? Nie mogę uzyskać tego do pracy – user264230

+2

qs jest kluczem ciągu zapytania. Więc jakie pola chcesz w ciągu zapytania. {field1: "test1", pole2: "test2"} – Daniel

3

Jeśli nie chcesz korzystać z zewnętrznego pakietu, należy dodać następującą funkcję w swoich narzędzi:

var params=function(req){ 
    let q=req.url.split('?'),result={}; 
    if(q.length>=2){ 
     q[1].split('&').forEach((item)=>{ 
      try { 
      result[item.split('=')[0]]=item.split('=')[1]; 
      } catch (e) { 
      result[item.split('=')[0]]=''; 
      } 
     }) 
    } 
    return result; 
} 

Następnie w createServer oddzwonić, dodać atrybut params do request obiektu:

http.createServer(function(req,res){ 
    req.params=params(req); // call the function above ; 
     /** 
     * http://mysite/add?name=Ahmed 
     */ 
    console.log(req.params.name) ; // display : "Ahmed" 

}) 
+1

Pytanie OP dotyczy klientów HTTP, a nie serwerów http. Ta odpowiedź jest przydatna do analizowania ciągów zapytań na serwerze http, nie kodując ciągów zapytań dla żądania http. –

0

Mam problem z dodawaniem parametrów ciągu zapytania do mojego adresu URL. Nie mogłem działać, dopóki nie zorientowałem się, że muszę dodać ? na końcu mojego adresu URL, w przeciwnym razie nie zadziała. Jest to bardzo ważne, ponieważ pozwoli Ci to zaoszczędzić wiele godzin debugowania, uwierz mi: Byłem tam ... zrobiłem to.

Poniżej jest prostym API Endpoint że wywołuje Open Weather API i przechodzi APPID, lat i lon jako parametrów kwerendy i powrócić dane pogodowe jako JSON obiektu. Mam nadzieję że to pomoże.

//Load the request module 
var request = require('request'); 

//Load the query String module 
var querystring = require('querystring'); 

// Load OpenWeather Credentials 
var OpenWeatherAppId = require('../config/third-party').openWeather; 

router.post('/getCurrentWeather', function (req, res) { 
    var urlOpenWeatherCurrent = 'http://api.openweathermap.org/data/2.5/weather?' 
    var queryObject = { 
     APPID: OpenWeatherAppId.appId, 
     lat: req.body.lat, 
     lon: req.body.lon 
    } 
    console.log(queryObject) 
    request({ 
     url:urlOpenWeatherCurrent, 
     qs: queryObject 
    }, function (error, response, body) { 
     if (error) { 
      console.log('error:', error); // Print the error if one occurred 

     } else if(response && body) { 
      console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received 
      res.json({'body': body}); // Print JSON response. 
     } 
    }) 
}) 

Lub jeśli chcesz użyć modułu querystring, wprowadzić następujące zmiany

var queryObject = querystring.stringify({ 
    APPID: OpenWeatherAppId.appId, 
    lat: req.body.lat, 
    lon: req.body.lon 
}); 

request({ 
    url:urlOpenWeatherCurrent + queryObject 
}, function (error, response, body) {...}) 
Powiązane problemy