Js 使用查询字符串参数的 http‘ get’请求

我有一个 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 包可以实现这种封装。有没有一种被广泛使用的更好的方法?

Format 方法保存了构建自己的 URL 的工作。但理想情况下,请求的级别也会比这个高。

255342 次浏览

Check out the request module.

It's more full featured than node's built-in http client.

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

If you don't want use external package , Just add the following function in your utilities :

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

Then , in createServer call back , add attribute params to request object :

 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"


})

I have been struggling with how to add query string parameters to my URL. I couldn't make it work until I realized that I needed to add ? at the end of my URL, otherwise it won't work. This is very important as it will save you hours of debugging, believe me: been there...done that.

Below, is a simple API Endpoint that calls the 开放天气API and passes APPID, lat and lon as query parameters and return weather data as a JSON object. Hope this helps.

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

Or if you want to use the querystring module, make the following changes

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


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

No need for a 3rd party library. Use the nodejs url module to build a URL with query parameters:

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

Then make the request with the formatted url. requestUrl.path will include the query parameters.

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

If you ever need to send GET request to an IP as well as a Domain (Other answers did not mention you can specify a port variable), you can make use of this function:

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

Don't miss requiring modules at the top of your file:

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

Also bare in mind that you may use https module for communicating over secured network.