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

2024-05-16

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


你的代码没有意义。在第一个路由中,您告诉 Express 使用 302 重定向进行响应并发送一些数据。它正在发送您的 JSON对于客户来说,您可以看到您得到了正确的结果Content-Length.

但是,你的第二条路线行不通。首先,GET要求cannot有身体;req.body will always是空的。

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

  • 符合规范的 HTTP 客户端永远不会发送服务器的response作为另一个人的身体request.
  • 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>');
    

    丑陋,但有效if这是针对浏览器的。它不适用于服务器或其他非浏览器工具发出的请求。您可能还想为那些坚持禁用 JS 浏览的勒德分子添加一个“继续”提交按钮。

    仅当您拥有的数据量会使查询字符串超出 URL 中实际允许的字符数时,我才会使用此方法(~2048 https://stackoverflow.com/q/812925/201952)或者如果数据负载包含敏感内容,通常不应将其包含在查询字符串中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐