Node.js: Bagaimana cara mengirim header dengan data formulir menggunakan modul permintaan?

111

Saya memiliki kode seperti berikut:

var req = require('request');

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

Bagaimana cara menyetel header untuk ini? Saya perlu agen pengguna, tipe konten, dan mungkin sesuatu yang lain untuk dimasukkan ke dalam header:

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

Saya telah mencoba dalam berbagai cara tetapi saya dapat mengirim header atau data formulir, gagal mengirim keduanya.

Mykola G.
sumber

Jawaban:

194

Saya akhirnya berhasil melakukannya. Jawab dalam potongan kode di bawah ini:

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.
sumber
throw new Error ('undefined is not a valid uri or options object.') ^ Error: undefined bukan uri atau objek opsi yang valid. atas permintaan (C: \ Users \ pjt \ node_modules \ request \ index.js: 44: 11) di Request._callback (C: \ Users \ pjt \ routes \ payment.js: 170: 11) di Request.self.callback (C: \ Users \ pjt \ node_modules \ request \ request.js: 186: 22) di emitTwo (events.js: 106: 13) di Request.emit (events.js: 194: 7) di Request. <anonim> (C: \ Users \ pjt \ node_modules \ request \ request.js: 1163: 10) di emitOne (events.js: 96: 13) di Request.emit (events.js: 191: 7)
Tamilselvan K
Ini tidak berhasil untuk saya di mana jawaban di bawah ini yang hanya menetapkan objek untuk dibentuk.
ozzieisaacs
49

Ini seharusnya berhasil.

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
});
pengguna606521
sumber
Terima kasih, tetapi tampaknya dalam kasus ini data formulir tidak dikirim dengan cara yang benar. Saya memiliki kode yang hampir sama di .Net dan jika data formulir dikirim, saya seharusnya tidak memiliki formulir login di badan dan harus memiliki token. Saya akan mempostingnya di sini segera, mungkin ini akan membantu
Mykola G.
17

Saya pikir itu hanya karena Anda lupa METODE HTTP . Metode permintaan HTTP default adalah GET.

Anda harus menambahkan method: 'POST'dan kode Anda akan berfungsi jika backend Anda menerima metode posting.

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
sumber
1
Ini adalah jawaban yang lebih baik karena tidak bergantung pada stringify yang membuatnya lebih mudah dibaca.
Keith John Hutchison
6

Saya menemukan solusi dari masalah ini dan saya harus bekerja. Saya yakin tentang ini karena saya juga menghadapi masalah yang sama

inilah solusi saya ----->

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
sumber
1
saya mengedit jawaban saya, silakan lihat dan kemudian katakan jika ada masalah di dalamnya. terima kasih
Chetna Joshi
jawaban Anda benar dan membantu saya juga, tetapi cobalah untuk menerapkan kode pendek yang menjelaskan solusinya saja
Amy
2

Ingat saja setel metode ke POST dalam opsi. Ini kode saya

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
sumber