我有一个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);
});
这似乎是一个很好的方法来实现这一目标。但是我有点恼火,我必须做url + query
步骤。这应该由一个公共库封装,但我没有看到它存在于节点的http
库中,我不确定标准的npm包可以实现它。是否有一种相当广泛使用的方式更好?
url.format方法可以节省构建自己的URL的工作。但理想情况下,请求的级别也会高于此级别。
答案 0 :(得分:131)
查看request模块。
它比节点的内置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);
});
答案 1 :(得分: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;
}
然后,在createServer
回调中,将属性params
添加到request
对象:
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"
})
答案 2 :(得分:5)
我一直在努力解决如何将查询字符串参数添加到我的URL。在我意识到我需要在网址末尾添加?
之前,我无法使其正常工作,否则它将无效。这非常重要,因为它可以节省你的调试时间,相信我:在那里......完成了。
下面是一个简单的API端点,它调用 https://stackoverflow.com/a/19821995/4046067 并传递APPID
,lat
和lon
作为查询参数并返回天气数据作为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.
}
})
})
或者如果您想使用querystring
模块,请进行以下更改
var queryObject = querystring.stringify({
APPID: OpenWeatherAppId.appId,
lat: req.body.lat,
lon: req.body.lon
});
request({
url:urlOpenWeatherCurrent + queryObject
}, function (error, response, body) {...})
答案 3 :(得分:2)
无需第三方库。使用nodejs url module构建带有查询参数的URL:
const requestUrl = url.parse(url.format({
protocol: 'https',
hostname: 'yoursite.com',
pathname: '/the/path',
query: {
key: value
}
}));
然后使用格式化的URL发出请求。 requestUrl.path
将包含查询参数。
const req = https.get({
hostname: requestUrl.hostname,
path: requestUrl.path,
}, (res) => {
// ...
})
答案 4 :(得分:1)
如果您需要同时向GET
和IP
发送Domain
请求(其他答案未提及,您可以指定一个port
变量),可以使用此功能:
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);
});
}
不要错过文件顶部所需的模块:
http = require("http");
url = require('url')
请记住,您可以使用https
模块通过安全网络进行通信。