Node.js:如何使用请求模块发送带表单数据的标题?

122

我有下面这样的一段代码:

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' 
};
我尝试了多种方式,但我只能发送头部或表单数据,无法同时发送两者。
5个回答

212

我终于成功了。 请参见下面的代码片段:

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

throw new Error('未定义的 URI 或选项对象无效。') ^错误: 未定义的 URI 或选项对象无效。 at request (C:\Users\pjt\node_modules\request\index.js:44:11) at Request._callback (C:\Users\pjt\routes\payment.js:170:11) at Request.self.callback (C:\Users\pjt\node_modules\request\request.js:186:22) at emitTwo (events.js:106:13) at Request.emit (events.js:194:7) at Request.<anonymous> (C:\Users\pjt\node_modules\request\request.js:1163:10) at emitOne (events.js:96:13) at Request.emit (events.js:191:7) - Tamilselvan K
以下回答对我没有起作用,而下面的答案只是将一个对象设置为表单。 - ozzieisaacs
1
它已被弃用。https://www.npmjs.com/package/request - Andriy Antonov

55

这应该可以正常工作。

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 中有几乎相同的代码,如果表单数据被发送,我不应该在正文中有登录表单,并且应该有令牌。我很快会在这里发布它,可能会有所帮助。 - Mike G.
2
request 已被弃用... https://www.npmjs.com/package/request - Andriy Antonov

21

我认为问题在于你忘记了HTTP方法。请求的默认HTTP方法是GET。

如果你的后端接收POST方法,你应该添加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

10

我找到了解决这个问题的方法,并且它应该有效。我确定它有效,因为我之前也遇到过同样的问题。

这是我的解决方案 ----->

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

6

只需要在选项中设置方法为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);
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接