node.js http 'get' запрос с параметрами строки запроса

84

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

Джехлин
источник

Ответы:

158

Ознакомьтесь с модулем запроса .

Он более полнофункциональный, чем встроенный 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);
});
Даниэль
источник
Как будет выглядеть типичный объект propertiesObject? Я не могу заставить это работать
user264230 05
3
Qs - это ключ строки запроса. Итак, какие поля вы хотите в строке запроса. {field1: 'test1', field2: 'test2'}
Дэниел
Кто-нибудь знает, как это сделать с помощью основного http-модуля Nodejs?
Александр Миллс
1
@AlexanderMills видит мой ответ. Сторонняя библиотека не нужна.
Джастин Майнерс
9
Модуль запроса устарел и устарел.
AmiNadimi
19

Нет необходимости в сторонней библиотеке. Используйте модуль 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 с запросами, поэтому я думаю, что принятый ответ более актуален лично
Скотт Андерсон
3
@ScottAnderson Я в порядке, если я не принятый ответ. Просто хочу помочь людям сделать то, что им нужно. Рад, что это могло вам помочь.
Джастин Майнерс,
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
Вопрос OP касается http-клиентов, а не http-серверов. Этот ответ актуален для синтаксического анализа строк запроса на HTTP-сервере, а не для кодирования строк запроса для HTTP-запроса.
Стивен Шауб
Это делает противоположное тому, о чем был задан вопрос, и также лучше использовать встроенный querystringмодуль Node, чем пытаться разбирать это самостоятельно.
peterflynn
6

Я боролся с тем, как добавить параметры строки запроса к моему 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) {...})
AllJs
источник
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модуль для связи по защищенной сети.

АмиНадими
источник