使用Express.js和NodeJS,您可以通过响应正文中的重定向发送JSON

时间:2014-01-28 23:13:43

标签: json node.js express

我正在尝试通过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的响应标头显示数据的正确内容长度,但接收端显示空对象。

1 个答案:

答案 0 :(得分:7)

您的代码没有意义。在第一个路由中,您告诉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禁用浏览的luddites包含一个“继续”提交按钮。

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