93 votes

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

J'ai une application Node.js qui est un client http (pour le moment). Donc 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 bon moyen d'y parvenir. Cependant, je suis un peu déçu d'avoir dû faire l'opération suivante url + query étape. Ceci devrait être encapsulé par une bibliothèque commune, mais je ne vois pas ce qui existe dans la bibliothèque de node. http et je ne suis pas sûr du paquet standard npm qui pourrait le faire. Existe-t-il une méthode plus répandue qui soit meilleure ?

url.format permet d'économiser le travail de construction de sa propre URL. Mais idéalement, la demande sera d'un niveau supérieur à celui-ci.

171voto

Daniel Points 9676

Consultez le demande module.

Il est plus complet que le client http intégré de node.

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

35voto

Justin Meiners Points 5282

Il n'est pas nécessaire de recourir à une bibliothèque tierce. Utilisez la bibliothèque nodejs module url pour construire une URL avec des paramètres d'interrogation :

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

Ensuite, faites 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) => {
   // ...
})

8voto

Si vous ne voulez pas utiliser de paquet 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;
}

Alors, en createServer rappeler, ajouter un attribut params a 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"

})

6voto

AllJs Points 434

J'ai eu du mal à trouver comment ajouter des paramètres de chaîne de requête à mon URL. Je n'arrivais pas à le faire fonctionner jusqu'à ce que je me rende compte que je devais ajouter ? à la fin de mon URL, sinon cela ne fonctionnera pas. C'est très important car cela vous épargnera des heures de débogage, croyez-moi : J'ai été là... j'ai fait ça .

Ci-dessous, vous trouverez un point de terminaison API simple qui appelle la fonction API météo ouverte et passe APPID , lat y lon en tant que paramètres de requête et renvoie les données météorologiques sous la forme d'un fichier de type JSON objet. J'espère que cela vous aidera.

//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 voulez utiliser le 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) {...})

2voto

AmiNadimi Points 1522

Si jamais vous avez besoin d'envoyer GET à une IP ainsi qu'un Domain (Les autres réponses ne mentionnent pas que vous pouvez spécifier une port ), vous pouvez utiliser cette fonction :

function getCode(host, port, path, queryString) {
    console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")

    // Construct url and query string
    const requestUrl = url.parse(url.format({
        protocol: 'http',
        hostname: host,
        pathname: path,
        port: port,
        query: queryString
    }));

    console.log("(" + host + path + ")" + "Sending GET request")
    // Send request
    console.log(url.format(requestUrl))
    http.get(url.format(requestUrl), (resp) => {
        let data = '';

        // A chunk of data has been received.
        resp.on('data', (chunk) => {
            console.log("GET chunk: " + chunk);
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            console.log("GET end of response: " + data);
        });

    }).on("error", (err) => {
        console.log("GET Error: " + err);
    });
}

Ne manquez pas de demander des modules en tête de votre dossier :

http = require("http");
url = require('url')

N'oubliez pas non plus que vous pouvez utiliser https pour communiquer sur un réseau sécurisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X