web-dev-qa-db-fra.com

node.js http 'get' demande avec des paramètres de chaîne de requête

J'ai une application Node.js qui est un client http (pour le moment). Alors je fais:

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

Cela semble être un assez bon moyen d'y parvenir. Cependant, je suis un peu vexé de devoir faire le url + query étape. Cela devrait être encapsulé par une bibliothèque commune, mais je ne le vois pas encore dans la bibliothèque http du nœud et je ne suis pas sûr du paquet npm standard qui pourrait le faire. Y a-t-il un moyen raisonnablement largement utilisé qui est meilleur?

La méthode rl.format enregistre le travail de construction de sa propre URL. Mais idéalement, la demande sera également de niveau supérieur.

60
djechlin

Découvrez le module request .

Il est plus complet que le client http intégré du noeud.

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

Si vous ne souhaitez pas utiliser de package externe, ajoutez simplement la fonction suivante dans vos utilitaires:

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

Ensuite, dans createServer rappel, ajoutez l'attribut params à request objet:

 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"

})
6
Abdennour TOUMI

J'avais du mal à ajouter des paramètres de chaîne de requête à mon URL. Je ne pouvais pas le faire fonctionner avant de réaliser que je devais ajouter ? à la fin de mon URL, sinon cela ne fonctionnera pas. C’est très important car cela vous évitera des heures de débogage, croyez-moi: y êtes allé ... faites-le .

Ci-dessous, un point de terminaison d’API simple qui appelle le API Open Weather et transmet APPID, lat et lon comme paramètres de requête et renvoient les données météorologiques sous forme d'objet JSON. J'espère que cela t'aides.

//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.
        }
    })
})  

Ou si vous souhaitez utiliser le module querystring, apportez les modifications suivantes

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

request({
   url:urlOpenWeatherCurrent + queryObject
}, function (error, response, body) {...})
5
AllJs

Pas besoin d'une bibliothèque tierce. Utilisez le noeud nodejs module d'URL pour créer une URL avec des paramètres de requête:

const requestUrl = url.parse(url.format({
    protocol: 'https',
    hostname: 'yoursite.com',
    pathname: '/the/path',
    query: {
        key: value
    }
}));

Faites ensuite la demande avec l'URL formatée. requestUrl.path inclura les paramètres de la requête.

const req = https.get({
    hostname: requestUrl.hostname,
    path: requestUrl.path,
}, (res) => {
   // ...
})
4
Justin Meiners