Вопрос по http, node.js, query-string – node.js http 'get' запрос с параметрами строки запроса

56

У меня есть приложение 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. Но в идеале запрос будет более высокого уровня, чем этот также.

nodejs.org/api/querystring.html velop

Ваш Ответ

4   ответа
129

запрос модуль.

Это'более полнофункциональный, чем узел 'Встроенный 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);
});
Кто-нибудь знает, как сделать это с помощью только основного модуля HTTP Nodejs? Alexander Mills
Qs является ключом строки запроса. Итак, какие поля вы хотите в строке запроса. {Field1:»test1', Field2:»test2' } Daniel
@AlexanderMills см. Мой ответ. Сторонняя библиотека не нужна. Justin Meiners
Как будут выглядеть типичные свойства объекта? Я не могу заставить это работать user264230
1

Используйте nodejsбиблиотека URL построить 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) => {
   // ...
})
5

как добавить параметры строки запроса в мой URL. Я не могпока я не понял, что мне нужно добавить? в конце моего URL, иначе он выигралт работа. Это очень важно, так как это сэкономит вам часы отладки, поверьте мне:был там ... сделал это.

Ниже приведена простая конечная точка API, которая вызываетOpen Weather API и проходит,APPIDlat а также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) {...})
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"

})
ОП 'Вопрос касается клиентов http, а не серверов http. Этот ответ важен для анализа строк запроса на http-сервере, а не для кодирования строк запроса для http-запроса. Stephen Schaub
Это противоположно тому, о чем спрашивал вопрос, а такжелучше использоватьУзел'с встроеннымquerystring модуль вместо того, чтобы пытаться разобрать это самостоятельно. peterflynn

Похожие вопросы