使用nodejs、express和body-parser解析GET请求中的主体?

3

如何使用express检索body内容呢?

我尝试了body-parser,但似乎不能与GET一起使用。有没有其他模块可以实现呢?

var express = require('express'),
  bodyParser = require('body-parser'),
  PORT = process.env.PORT || 4101,
  app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.route('/')
  .get(function(req, res) {
    respond(req, res, 'GET body contents:\n');
  })
  .post(function(req, res) {
    respond(req, res, 'POST body contents:\n');
  });

app.listen(PORT, function(err) {
  if (err) {
    console.log('err on startup ' + err);
    return;
  }
  console.log('Server listening on port ' + PORT);
});

/*
 * Send a response back to client
 */
function respond(req, res, msg){
  res.setHeader('Content-Type', 'text/plain');
  res.write(msg);
  res.end(JSON.stringify(req.body, null, 2));
}

这是GET请求的响应内容:
GET body contents:
{}

并且从 POST 中:

POST body contents:
{
    "gggg": ""
}

1
首先,GET请求没有请求体。 - Héctor
1
请看这个链接:https://dev59.com/53NA5IYBdhLWcg3wZ85S - lauriys
GET请求没有请求体,请使用POST请求。 - Sapikelio
@bigdestroyer GET请求确实允许包含正文。 - bobbyrne01
2
@bobbyrne01 在HTTP规范中,虽然GET请求可以有消息体,但服务器应该忽略它,因为它没有意义。请参见此答案。服务器会如何处理所有这些UUID呢?也许需要以不同的方式构建应用程序,超长的URL可能不是正确的工具... - Mark Hughes
1个回答

6

GET请求没有请求体,它们有查询字符串。为了在expressJS中访问查询字符串,您应该使用req.query对象。

res.end(JSON.stringify(req.query, null, 2));

问题是,我希望用户在GET请求体中提交一个uuids列表。我将根据这些uuids在数据库中查找。可能会传递数百个uuids,这些都应该放入查询字符串中吗? - bobbyrne01
@bobbyrne01 为什么你不能使用POST请求呢?查询字符串的长度有限制,但是相当大。 - Vsevolod Goloviznin
我可以使用 POST,但尽可能保持 RESTful。我理解长度限制很大,但有可能会遇到它的限制。 - bobbyrne01
1
这完全取决于架构和需求。例如,您可以限制批处理中可处理的项目数量,或者您可以使整个过程异步化,其中您发布批处理,然后检查批处理的状态。 - Vsevolod Goloviznin
如果您想保持RESTful,请使用GET头。它们可以实现与POST(等等)主体相同的效果。请查看https://www.owasp.org/index.php/REST_Security_Cheat_Sheet#Sensitive_information_in_HTTP_requests - aggregate1166877
GET语句可以有正文。这一点在2014年进行了更改。 - d36williams

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