Node.js: Comment envoyer des en-têtes avec des données de formulaire à l'aide du module de requête?

111

J'ai du code comme le suivant:

var req = require('request');

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

Comment puis-je définir des en-têtes pour cela? J'ai besoin de user-agent, content-type et probablement autre chose dans les en-têtes:

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

J'ai essayé de plusieurs manières, mais je peux envoyer des en-têtes ou des données de formulaire, mais j'ai échoué à envoyer les deux.

Mykola G.
la source

Réponses:

194

J'ai finalement réussi à le faire. Répondez dans l'extrait de code ci-dessous:

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.
la source
throw new Error ('undefined n'est pas un uri ou un objet d'options valide.') ^ Erreur: undefined n'est pas un uri ou un objet d'options valide. à la demande (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. <anonyme> (C: \ Users \ pjt \ node_modules \ request \ request.js: 1163: 10) à emitOne (events.js: 96: 13) à Request.emit (events.js: 191: 7)
Tamilselvan K
Cela n'a pas fonctionné pour moi là où la réponse ci-dessous, qui définit simplement un objet en forme, a fonctionné.
ozzieisaacs
49

Cela devrait fonctionner.

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
});
user606521
la source
Merci, mais il semble que dans ce cas, les données du formulaire ne soient pas envoyées correctement. J'ai presque le même code dans .Net et si des données de formulaire sont envoyées, je ne devrais pas avoir de formulaire de connexion dans le corps et je devrais avoir un jeton. Je le posterai ici bientôt, cela aidera probablement
Mykola G.
17

Je pense que c'est juste parce que vous avez oublié la méthode HTTP . La méthode de requête HTTP par défaut est GET.

Vous devez ajouter method: 'POST'et votre code fonctionnera si votre backend reçoit la méthode de publication.

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
la source
1
C'est une meilleure réponse car elle ne repose pas sur stringify, ce qui facilite la lecture.
Keith John Hutchison
6

J'ai trouvé la solution de ce problème et je devrais travailler j'en suis sûr car je suis également confronté au même problème

voici ma solution ----->

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
la source
1
J'ai modifié ma réponse s'il vous plaît voir et dire ensuite s'il y a un problème à ce sujet. merci
Chetna Joshi
votre réponse est juste et m'a aidé aussi, mais essayez d'implémenter un code court qui n'explique que la solution
Amy
2

N'oubliez pas de définir la méthode sur POST dans les options. Voici mon code

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
la source