我如何读取节点服务器上以application / x-www-form-urlencoded格式接收的数据?

问题描述 投票:15回答:3

我正在将Webhook URL上的数据作为POST请求接收。请注意,此请求的内容类型为application/x-www-form-urlencoded

这是服务器到服务器的请求。并且在我的Node服务器上,我只是尝试使用req.body.parameters读取接收到的数据,但是结果值为“ undefined”

那么我如何读取数据请求数据?我需要解析数据吗?我需要安装任何npm模块吗?您可以编写一个说明情况的代码段吗?

node.js http-post
3个回答
21
投票

如果将Express.js用作Node.js Web应用程序框架,请使用ExpressJS body-parser

示例代码将是这样。

var bodyParser = require('body-parser');
app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies

// With body-parser configured, now create our route. We can grab POST 
// parameters using req.body.variable_name

// POST http://localhost:8080/api/books
// parameters sent with 
app.post('/api/books', function(req, res) {
    var book_id = req.body.id;
    var bookName = req.body.token;
    //Send the response back
    res.send(book_id + ' ' + bookName);
});

0
投票

如果使用restify,它将类似于:

var server = restify.createServer()
server.listen(port, () => console.log(`${server.name} listening ${server.url}`))
server.use(restify.plugins.bodyParser()) // can parse Content-type: 'application/x-www-form-urlencoded'
server.post('/your_url', your_handler_func)

0
投票

接受的答案使用express和body-parser中间件来表达。但是,如果您只想解析发送到您的Node http服务器的application / x-www-form-urlencoded ContentType的有效负载,则可以完成此任务而无需额外的Express。

您提到的关键是http方法是POST。因此,使用application / x-www-form-urlencoded时,参数将不会编码在查询字符串中。相反,有效负载将以与查询字符串相同的格式在请求正文中发送:

param=value&param2=value2 

为了在请求正文中获得有效负载,我们可以使用StringDecoder,它以保留编码的多字节UTF8字符的方式将缓冲区对象解码为字符串。因此,我们可以使用on方法将'data'和'end'事件绑定到请求对象,并在缓冲区中添加字符:

const StringDecoder = require('string_decoder').StringDecoder;
const http = require('http');

const httpServer = http.createServer((req, res) => {
  const decoder = new StringDecoder('utf-8');
  let buffer = '';

  req.on('data', (chunk) => {
    buffer += decoder.write(chunk);
  });

  request.on('end', () => {
    buffer += decoder.end();
    res.writeHead(200, 'OK', { 'Content-Type': 'text/plain'});
    res.write('the response:\n\n');
    res.write(buffer + '\n\n');
    res.end('End of message to browser');
  });
};

httpServer.listen(3000, () => console.log('Listening on port 3000') );
© www.soinside.com 2019 - 2024. All rights reserved.