Node.js: ¿Cómo enviar encabezados con datos de formulario usando el módulo de solicitud?

111

Tengo un código como el siguiente:

var req = require('request');

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

¿Cómo puedo configurar encabezados para esto? Necesito user-agent, content-type y probablemente algo más para estar en los encabezados:

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' 
};

Lo intenté de varias maneras, pero puedo enviar el encabezado o los datos del formulario, pero no pude enviar ambos.

Mykola G.
fuente

Respuestas:

194

Finalmente logré hacerlo. Responda en el fragmento de código a continuación:

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!
  });
Mykola G.
fuente
throw new Error ('undefined no es un objeto uri u options válido.') ^ Error: undefined no es un objeto uri u options válido. a pedido (C: \ Users \ pjt \ node_modules \ request \ index.js: 44: 11) en Request._callback (C: \ Users \ pjt \ routes \ payment.js: 170: 11) en Request.self.callback (C: \ Users \ pjt \ node_modules \ request \ request.js: 186: 22) en emitTwo (events.js: 106: 13) en Request.emit (events.js: 194: 7) en Request. <anónimo> (C: \ Users \ pjt \ node_modules \ request \ request.js: 1163: 10) en emitOne (events.js: 96: 13) en Request.emit (events.js: 191: 7)
Tamilselvan K
Esto no funcionó para mí donde lo hizo la respuesta a continuación, que solo establece un objeto en forma.
ozzieisaacs
49

Esto debería funcionar.

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
});
usuario606521
fuente
Gracias, pero parece que en este caso los datos del formulario no se envían correctamente. Tengo casi el mismo código en .Net y, en caso de que se envíen los datos del formulario, no debería tener un formulario de inicio de sesión en el cuerpo y debería tener un token. Lo publicaré aquí pronto, probablemente ayude
Mykola G.
17

Creo que es solo porque has olvidado el METHOD HTTP . El método de solicitud HTTP predeterminado es GET.

Debe agregar method: 'POST'y su código funcionará si su backend recibe el método de publicación.

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);
  });
nodejh
fuente
1
Esta es una mejor respuesta ya que no depende de stringify, lo que facilita la lectura.
Keith John Hutchison
6

Encontré la solución a este problema y debería trabajar, estoy seguro de esto porque también enfrento el mismo problema

aquí está mi solución ----->

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);
});
Chetna Joshi
fuente
1
Edité mi respuesta, por favor vea y luego diga si hay algún problema en eso. gracias
Chetna Joshi
su respuesta es correcta y también me ayudó, pero intente implementar un código corto que explique solo la solución
Amy
2

Solo recuerde configurar el método para POST en las opciones. Aqui esta mi codigo

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);
    }
});
VnDevil
fuente