Node.js: จะส่งส่วนหัวพร้อมข้อมูลแบบฟอร์มโดยใช้โมดูลคำขอได้อย่างไร


110

ฉันมีรหัสดังต่อไปนี้:

var req = require('request');

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

ฉันจะตั้งค่าส่วนหัวสำหรับสิ่งนี้ได้อย่างไร ฉันต้องการ user-agent ประเภทเนื้อหาและอาจเป็นอย่างอื่นในส่วนหัว:

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

ฉันได้ลองหลายวิธีแล้ว แต่ฉันสามารถส่งส่วนหัวหรือแบบฟอร์มข้อมูลได้ไม่สามารถส่งทั้งสองอย่างได้

คำตอบ:


193

ในที่สุดฉันก็ทำสำเร็จแล้ว ตอบในส่วนโค้ดด้านล่าง:

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!
  });

โยนข้อผิดพลาดใหม่ ('ไม่ได้กำหนดไม่ใช่วัตถุ uri หรืออ็อพชันที่ถูกต้อง') ตามคำขอ (C: \ Users \ pjt \ node_modules \ request \ index.js: 44: 11) ที่ Request._callback (C: \ Users \ pjt \ route \ 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) ตามคำขอ <anonymous> (C: \ Users \ pjt \ node_modules \ request \ request.js: 1163: 10) ที่ emitOne (events.js: 96: 13) ที่ Request.emit (events.js: 191: 7)
Tamilselvan K

สิ่งนี้ไม่ได้ผลสำหรับฉันที่คำตอบด้านล่างซึ่งเพิ่งตั้งค่าวัตถุให้เป็นแบบทำ
ozzieisaacs

49

สิ่งนี้ควรใช้งานได้

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

ขอบคุณ แต่ในกรณีนี้ข้อมูลฟอร์มจะไม่ถูกส่งด้วยวิธีที่เหมาะสม ฉันมีรหัสเกือบเหมือนกันใน. Net และในกรณีที่มีการส่งข้อมูลแบบฟอร์มฉันไม่ควรมีแบบฟอร์มการเข้าสู่ระบบในร่างกายและควรมีโทเค็น ฉันจะโพสต์ที่นี่เร็ว ๆ นี้อาจช่วยได้
Mykola G.

17

ฉันคิดว่ามันเป็นเพียงเพราะคุณลืมHTTP วิธี วิธีการร้องขอ HTTP เริ่มต้นคือ GET

คุณควรเพิ่มmethod: '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);
  });

1
นี่เป็นคำตอบที่ดีกว่าเนื่องจากไม่ต้องพึ่งพา stringify ซึ่งทำให้อ่านง่ายขึ้น
Keith John Hutchison

6

ฉันพบวิธีแก้ปัญหานี้แล้วและฉันควรจะทำงานได้ฉันแน่ใจเกี่ยวกับเรื่องนี้เพราะฉันก็ประสบปัญหาเดียวกัน

นี่คือทางออกของฉัน ----->

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

1
ฉันแก้ไขคำตอบของฉันโปรดดูแล้วบอกว่ามีปัญหาใด ๆ ในนั้น ขอบคุณ
Chetna Joshi

คำตอบของคุณถูกต้องและช่วยฉันด้วย แต่พยายามติดตั้งโค้ดสั้น ๆ ที่อธิบายวิธีแก้ปัญหาเท่านั้น
Amy

2

เพียงจำวิธีการตั้งค่าเป็น 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);
    }
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.