Node.js: как отправлять заголовки с данными формы с помощью модуля запроса?

У меня есть следующий код:

var req = require('request');

req.post('someUrl',
   { form: { username: 'user', password: '', opaque: 'someValue', logintype: '1'}, },
   function (e, r, body) {
      console.log(body);
});

Как я могу установить заголовки для этого? Мне нужно, чтобы пользовательский агент, тип контента и, возможно, что-то еще было в заголовках:

headers = { 
   'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36',
   'Content-Type' : 'application/x-www-form-urlencoded' 
};

Я пробовал несколькими способами, но я могу отправить заголовок или данные формы, но не смог отправить оба.


person Mike G.    schedule 15.06.2013    source источник


Ответы (5)


Мне наконец удалось это сделать. Ответ во фрагменте кода ниже:

var querystring = require('querystring');
var request = require('request');

var form = {
    username: 'usr',
    password: 'pwd',
    opaque: 'opaque',
    logintype: '1'
};

var formData = querystring.stringify(form);
var contentLength = formData.length;

request({
    headers: {
      'Content-Length': contentLength,
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    uri: 'http://myUrl',
    body: formData,
    method: 'POST'
  }, function (err, res, body) {
    //it works!
  });
person Mike G.    schedule 09.07.2014
comment
throw new Error('undefined не является допустимым uri или объектом параметров.') ^ Ошибка: undefined не является допустимым uri или объектом параметров. по запросу (C:\Users\pjt\node_modules\request\index.js:44:11) по адресу Request._callback (C:\Users\pjt\routes\payment.js:170:11) по адресу Request.self.callback (C:\Users\pjt\node_modules\request\request.js:186:22) в emitTwo (events.js:106:13) в Request.emit (events.js:194:7) в Request.‹anonymous› (C:\Users\pjt\node_modules\request\request.js:1163:10) в emitOne (events.js:96:13) в Request.emit (events.js:191:7) - person Tamilselvan K; 25.03.2018
comment
Это не сработало для меня, где ответ ниже, который просто устанавливает форму объекта. - person ozzieisaacs; 11.06.2018
comment
его устаревший npmjs.com/package/request - person Andriy Antonov; 15.01.2021

Это должно работать.

var url = 'http://<your_url_here>';
var headers = { 
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0',
    'Content-Type' : 'application/x-www-form-urlencoded' 
};
var form = { username: 'user', password: '', opaque: 'someValue', logintype: '1'};

request.post({ url: url, form: form, headers: headers }, function (e, r, body) {
    // your callback body
});
person user606521    schedule 15.06.2013
comment
Спасибо, но, похоже, в этом случае данные формы не отправляются должным образом. У меня почти такой же код в .Net, и в случае отправки данных формы у меня не должно быть формы входа в тело и должен быть токен. Скоро выложу сюда, может поможет - person Mike G.; 17.06.2013
comment
request устарел... npmjs.com/package/request - person Andriy Antonov; 15.01.2021

Я думаю, это просто потому, что вы забыли HTTP METHOD. Метод HTTP-запроса по умолчанию — GET.

Вы должны добавить method: 'POST', и ваш код будет работать, если ваш бэкенд получит метод post.

var req = require('request');

req.post({
   url: 'someUrl',
   form: { username: 'user', password: '', opaque: 'someValue', logintype: '1'},
   headers: { 
      'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36',
      'Content-Type' : 'application/x-www-form-urlencoded' 
   },
   method: 'POST'
  },

  function (e, r, body) {
      console.log(body);
  });
person nodejh    schedule 06.10.2016
comment
Это лучший ответ, так как он не полагается на stringify, что облегчает чтение. - person Keith John Hutchison; 24.11.2016

Я нашел решение этой проблемы, и оно должно работать. Я уверен в этом, потому что я тоже столкнулся с той же проблемой

вот мое решение ----- ›

var request = require('request');

//set url
var url = 'http://localhost:8088/example';

//set header
var headers = {
    'Authorization': 'Your authorization'
};

//set form data
var form = {first_name: first_name, last_name: last_name};

//set request parameter
request.post({headers: headers, url: url, form: form, method: 'POST'}, function (e, r, body) {

    var bodyValues = JSON.parse(body);
    res.send(bodyValues);
});
person Chetna Joshi    schedule 11.09.2018
comment
я отредактировал свой ответ, пожалуйста, посмотрите, а затем скажите, если в этом есть проблема. Спасибо - person Chetna Joshi; 11.09.2018
comment
ваш ответ правильный и помог мне тоже, но попробуйте реализовать короткий код, который объясняет только решение - person Amy; 12.08.2019

Просто не забудьте установить метод POST в параметрах. Вот мой код

var options = {
    url: 'http://www.example.com',
    method: 'POST', // Don't forget this line
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'X-MicrosoftAjax': 'Delta=true', // blah, blah, blah...
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
    },
    form: {
        'key-1':'value-1',
        'key-2':'value-2',
        ...
    }
};

//console.log('options:', options);

// Create request to get data
request(options, (err, response, body) => {
    if (err) {
        //console.log(err);
    } else {
        console.log('body:', body);
    }
});
person VnDevil    schedule 21.11.2019