node.js http 'отримати' запит із параметрами рядка запиту


83

У мене є програма 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);
});

Як би виглядав типовий об’єкт властивостей? Я не можу змусити це працювати
user264230

3
Qs - це ключ рядка запиту. Отже, які поля ви хочете мати у рядку запиту. {field1: 'test1', field2: 'test2'}
Даніель

Хтось знає, як це зробити лише за допомогою основного модуля http Nodejs?
Олександр Міллс

1
@AlexanderMills бачить мою відповідь. Стороння бібліотека не потрібна.
Джастін Майнерс

8
Модуль запиту тепер застарілий та застарілий.
AmiNadimi

19

Не потрібно сторонньої бібліотеки. Використовуйте модуль 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) => {
   // ...
})

Я спробую використати це рішення, тому що я хотів би використати якийсь існуючий код, який використовує вбудований https, однак ОП просив абстракції вищого рівня та / або бібліотеки для складання рядків URL-адрес із запитами, тому я думаю, що прийняті відповідь справедливіша особисто
Скотт Андерсон

2
@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, яка викликає API Open Weather і передає її 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) {...})

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модуль для спілкування через захищену мережу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.