【问题标题】:ExpressJS : How to redirect a POST request with parametersExpressJS:如何使用参数重定向 POST 请求
【发布时间】:2013-07-10 20:45:52
【问题描述】:

我需要将 node.js 服务器的所有 POST 请求重定向到远程服务器。

我尝试了以下操作:

app.post('^*$', function(req, res) {
  res.redirect('http://remoteserver.com' + req.path);
});

重定向有效,但没有 POST 参数。我应该修改什么以保留 POST 参数?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    在 HTTP 1.1 中,有一个状态码 (307) 表示应该使用相同的方法重复请求并发布数据。

    307 临时重定向(HTTP/1.1 起) 在这种情况下,应该使用另一个 URI 重复请求,但以后的请求仍然可以使用原始 URI。与 303 不同的是,在重新发出原始请求时不应更改请求方法。例如,必须使用另一个 POST 请求重复一个 POST 请求。

    在express.js中,状态码是第一个参数:

    res.redirect(307, 'http://remoteserver.com' + req.path);
    

    programmers stackexchange 上了解更多信息。

    代理

    如果这不起作用,您还可以代表用户从服务器向另一台服务器发出 POST 请求。但请注意,发出请求的将是您的服务器,而不是用户。实质上,您将代理请求。

    var request = require('request'); // npm install request
    
    app.post('^*$', function(req, res) {
        request({ url: 'http://remoteserver.com' + req.path, headers: req.headers, body: req.body }, function(err, remoteResponse, remoteBody) {
            if (err) { return res.status(500).end('Error'); }
            res.writeHead(...); // copy all headers from remoteResponse
            res.end(remoteBody);
        });
    });
    

    正常重定向:

    user -> server: GET /
    server -> user: Location: http://remote/
    user -> remote: GET /
    remote -> user: 200 OK
    

    发布“重定向”:

    user -> server: POST /
    server -> remote: POST /
    remote -> server: 200 OK
    server -> user: 200 OK
    

    【讨论】:

    • 我尝试使用 307 代码进行重定向,不幸的是它不起作用。关于你的第二种方法,我也试过了,但是函数(err,remoteResponse,remoteBody){}回调永远不会被调用:(
    • 虽然这是真的,但规范告诉 307 应该将 POST 重定向到另一个 POST,但常见的实现方式是不这样做。例如,即使在代码 307 上,Apache HttpClient 也会将 POST 重定向到 GET:issues.apache.org/jira/browse/HTTPCLIENT-860
    • 需要为代理请求清理标头。例如,必须删除已为第一台服务器解析的主机:delete req.headers.host;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多