0

这基本上是我的代码:

// in file1.php

<?php print_r($_POST); ?>
<form method="POST" action="http://localhost:1234">
    <button type="submit" value="3" name="q">Register</button>
</form>

// in server.js

app.post('/', (req, res) => {
    request.post(
        req.headers.referer,
        { form: { test: "mytest" } }, 
        function (error, response, body) {
        if (!error && response.statusCode == 200) {
            // Print out the response body
            res.set("POST", "test=1234");
            res.redirect(302, req.headers.referer);
        }
    });
});

app.listen(1234);

这是这段代码需要做的:

当我进入file1.php并单击该Register按钮时,它应该将一个帖子请求发送回,file1.php其中包含{ test: "mytest" }来自的帖子标题http://localhost:1234file1.php对该发布请求执行某些操作并将响应发送回http://localhost:1234(在回调中request.post()),然后,它应该将 POST 标头更改为{ test: 1234 },重定向到file1.php并显示Array([test]=>1234) [Register button]在屏幕上。

问题是我无法让它在屏幕上显示该文本,似乎标题没有改变或者我没有很好地改变它们。我能做些什么?

4

2 回答 2

2

以这种方式重定向时,无法更改客户端的 POST 请求,除非您当然希望通过让服务器代表客户端执行重定向来代理请求。

但是有一些解决方案适合您,首先使用 307 而不是 302 来重定向您的帖子请求正文

res.redirect(307, "http://badasse.com/api/t2");

然后,您可以通过 GET 参数传递其他数据。

res.redirect(307, "http://badasse.com?morePost="+encodeURIComponent(JSON.stringify({data1: "yolo"}));

或标题:

 res.setHeader("MyHeader", "MyStringifiedDatas")

或者干脆尝试使用会话

req.session['success'] = 'User added successfully';
于 2017-05-23T13:32:30.597 回答
1

我认为您将标头与请求正文和标头名称与 HTTP 方法混淆了。

有了这个:

res.set("POST", "test=1234");

您只能更改响应标头,而不能告诉客户端在遵循重定向后使用此标头。

此外,设置名为 POST 的标头不会传递放入 POST 请求正文中该标头值中的数据。

您似乎正在尝试在 POST 请求中生成重定向结果,其中某些字段在正文中传递,但您在这里所做的是设置一个名为 POST 的标头,其中包含您可能希望在正文中设置的内容。它不会以这种方式工作。

正常重定向(301 Moved Permanently 或 302 Found)总是会导致 GET 请求,即使重定向是对 POST 的响应,因为实际上 301 和 302 的工作方式类似于 303 See Other 导致 GET 请求。有一个 307 临时重定向明确禁止更改 HTTP 方法,但浏览器应在遵循此类重定向之前警告用户,它可能并不总是有效。有关更多详细信息,请参阅此答案:

于 2017-05-23T13:01:50.940 回答