【问题标题】:Using Express.js and NodeJS, Can you send JSON via redirect in the response body使用 Express.js 和 NodeJS,您可以在响应正文中通过重定向发送 JSON
【发布时间】:2014-02-20 12:57:07
【问题描述】:

我正在尝试通过 302 重定向发送 JSON。在 ExpressJS 中可能吗? API 声明可以将主体添加到res.json()。例如:

res.json(302, {'name': 'larry'}).

在接收端(重定向也是如此),正文是空的。下面是一些示例代码:

发送应用

app.get('/hello', function(req,res){
  var data = {'name': 'larry'};
  res.set('location', 'http://www.example.com/sending');
  res.json(302, data);
});

接收应用

app.get('/sending', function(req,res){
  console.log('Body: ' + req.body)
  res.send(req.body);
});

注意:302 的响应标头显示数据的正确内容长度,但接收端显示一个空对象。

【问题讨论】:

  • 重定向是为了重定向,你不应该用它发送数据(除非重定向的文本表示,通常被用户代理省略)。

标签: json node.js express


【解决方案1】:

您的代码没有意义。在第一个路由中,您告诉 Express 以 302 重定向响应并发送一些数据。 它正在将您的 JSON 发送到客户端,您可以从得到正确的 Content-Length 的事实中看到这一点。

但是,您的第二条路线行不通。首先,GET 请求不能有正文; req.body始终为空。

其次,您似乎假设接收重定向的客户端将在其对目标的请求中重新提交重定向响应的实体主体(在这种情况下为 example.com/sending) .这是不正确的。

  • 符合规范的 HTTP 客户端永远不会将服务器的响应作为另一个请求的正文发送。
  • HTTP 客户端传统上将 302 视为 303,这意味着对目标 URL 的请求始终是 GET 请求,即使原始请求是 POST 也是如此。因此,重定向的请求不可能包含任何类型的正文。

如果您想将某种数据发送到另一台服务器,您有两种选择:

  • 使用 303 重定向发送查询字符串上的数据。

    // I'll use the built-in querystring module to convert an object into
    // a properly URL-encoded query string.
    res.redirect(303, '/url?' + querystring.stringify(data));
    
  • 响应 200 并使用浏览器端的诡计将数据POST 发送到真正的目的地。

    res.send('<form id="redir" method="post" action="/url">' +
             '<input type="hidden" name="foo" value="bar">' +
             // ...
             '</form>' +
             '<script>document.getElementById("redir").submit()</script>');
    

    丑陋,但如果适用于浏览器。它不适用于服务器或其他非浏览器工具发出的请求。您可能还想为坚持在禁用 JS 的情况下浏览的 luddite 包括一个“继续”提交按钮。

    如果您拥有的数据量将使查询字符串超过 URL 中实际允许的字符数 (~2048),或者如果数据有效负载包含敏感内容(通常不应该),我只会使用此方法被包含在查询字符串中。

【讨论】:

  • 307 重定向不会保留 POST 方法及其原始数据吗?
  • 是的,请求数据。 HTTP 客户端永远不会 POST 在重定向响应中收到的 response 数据。
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 2020-02-18
  • 2018-02-23
  • 1970-01-01
相关资源
最近更新 更多