У меня есть приложение 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. Но в идеале запрос будет и более высокого уровня.
node.js
http
query-string
Джехлин
источник
источник
Ответы:
Ознакомьтесь с модулем запроса .
Он более полнофункциональный, чем встроенный 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); });
источник
Нет необходимости в сторонней библиотеке. Используйте модуль url nodejs для создания 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) => { // ... })
источник
https
, однако OP запросил абстракцию более высокого уровня и / или библиотеки для составления строк URL с запросами, поэтому я думаю, что принятый ответ более актуален личноЕсли вы не хотите использовать внешний пакет, просто добавьте в свои утилиты следующую функцию:
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" })
источник
querystring
модуль Node, чем пытаться разбирать это самостоятельно.Я боролся с тем, как добавить параметры строки запроса к моему URL-адресу. Я не мог заставить его работать, пока не понял, что мне нужно добавить
?
в конец моего URL-адреса, иначе это не сработает. Это очень важно, так как это сэкономит вам часы на отладку, поверьте мне: был там ... сделал это .Ниже простой API Endpoint , который вызывает Open API погоды и проходит
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) {...})
источник
Если вам когда-либо понадобится отправить
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
модуль для связи по защищенной сети.источник