node.js带有查询字符串参数的http'get'请求

dje*_*lin 65 http node.js query-string

我有一个Node.js应用程序,它是一个http客户端(目前).所以我在做:

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);
});
Run Code Online (Sandbox Code Playgroud)

这似乎是一个很好的方法来实现这一目标.然而,我有点恼火,我不得不url + query迈出这一步.这应该由公共图书馆进行封装,但我不认为这存在于节点的http图书馆还没有,我不知道是什么标准NPM包可能完成它.是否有一种相当广泛使用的方式更好?

url.format方法保存了构建自己的URL的工作.但理想情况下,请求的级别也会高于此级别.

Dan*_*iel 141

查看请求模块.

它比node的内置http客户端更全面.

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);
});
Run Code Online (Sandbox Code Playgroud)

  • 请求模块现已过时并已弃用。 (15认同)
  • qs是查询字符串键.那么在查询字符串中你想要的字段是什么.{FIELD1: 'TEST1',FIELD2: 'TEST2'} (3认同)

Abd*_*UMI 6

如果您不想使用外部包,只需在您的实用程序中添加以下功能:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后,在createServer回调中,paramsrequest对象添加属性:

 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"

})
Run Code Online (Sandbox Code Playgroud)

  • OP的问题涉及http客户端,而不是http服务器.此答案与解析http服务器中的查询字符串相关,而不是为http请求编码查询字符串. (2认同)

All*_*lJs 5

我一直在努力解决如何将查询字符串参数添加到我的URL.直到我意识到我需要?在我的URL末尾添加它,否则它无法正常工作,否则它将无法正常工作.这非常重要,因为它可以节省你的调试时间,相信我:在那里......做到了.

下面是一个简单的API端点,它调用Open Weather API并传递APPID,latlon作为查询参数并将天气数据作为JSON对象返回.希望这可以帮助.

//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.
        }
    })
})  
Run Code Online (Sandbox Code Playgroud)

或者,如果要使用该querystring模块,请进行以下更改

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

request({
   url:urlOpenWeatherCurrent + queryObject
}, function (error, response, body) {...})
Run Code Online (Sandbox Code Playgroud)


Jus*_*ers 5

无需第三方库。使用nodejs url模块构建具有查询参数的URL:

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

然后使用格式化的网址发出请求。requestUrl.path将包含查询参数。

const req = https.get({
    hostname: requestUrl.hostname,
    path: requestUrl.path,
}, (res) => {
   // ...
})
Run Code Online (Sandbox Code Playgroud)

  • @ScottAnderson,如果我不是被接受的答案,我也没关系。只是想帮助人们完成他们需要做的事情。很高兴它能帮助你。 (5认同)