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

Dus*_*son 4 json node.js express

我试图通过302重定向发送JSON.这在ExpressJS中是否可行.API声明可以添加正文res.json().例如:

res.json(302, {'name': 'larry'}).
Run Code Online (Sandbox Code Playgroud)

在接收端(重定向也在那里),身体是空的.以下是一些示例代码:

发送应用程序

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

接收应用程序

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

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

jos*_*736 8

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

但是,您的第二条路线无法正常工作.首先,GET请求不能有一个机构; req.body永远是空的.

其次,看起来您假设接收重定向的客户端将在其请求中向目标重新提交重定向响应的实体主体(在本例中为example.com/sending).这是不正确的.

  • 符合规范的HTTP客户端永远不会将服务器的响应作为另一个请求的主体发送.
  • HTTP客户端传统上将302视为303,这意味着对目标URL的GET请求始终是请求,即使原始请求是a 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));
    
    Run Code Online (Sandbox Code Playgroud)
  • 响应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>');
    
    Run Code Online (Sandbox Code Playgroud)

    很丑,但是如果这是用于浏览器的,那就有用.它不适用于服务器或其他非浏览器工具发出的请求.您可能还想为luddites包含一个"继续"提交按钮,该按钮坚持使用JS禁用浏览.

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