gpt4 book ai didi

javascript - connect-modrewrite 将我的 POST 请求更改为 GET

转载 作者:行者123 更新时间:2023-12-02 21:15:15 26 4
gpt4 key购买 nike

我需要重定向 POST 请求,为了演示这个问题,我设置了 2 个 Nodejs 服务器。一个提供一些 HTML 并进行 mod 重写,另一个在重写后接收 POST。第一个提供 HTML 并进行重写的代码如下所示:

var connect = require('connect');
var cors = require('cors');
const modRewrite = require('connect-modrewrite')

var http = require('http');
const { nextTick } = require('process');

var app = connect();

app.use(cors())


app.use('/test', function(req, res, next){
res.end(`
<!doctype html><html><body>

<button type="button"class="yes">click</button>

<script>
async function postData (url = '', data = {}) {
const response = await fetch(url, {
method: 'POST',
mode: 'cors',
cache: 'no-cache',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'DELETE, POST, GET, OPTIONS'
},
redirect: 'follow', // manual, *follow, error
referrerPolicy: 'no-referrer', // no-referrer, *client
body: JSON.stringify(data)
})
return await response.json();
}

document.querySelector('.yes').addEventListener('click', () => {
postData('http://localhost:3000/a/b', { answer: 42 }).then(data => {
console.log(data);
});
});
</script></body></html>`);
});

app.use(function(req, res, next){
console.log('RECEIVED', req.method);
next();
});

app.use(modRewrite([
'^/(.*)$ http://localhost:4001/$1 [R, L]'
])
);

http.createServer(app).listen(3000);

因此行 '^/(.*)$ http://localhost:4001/$1 [R, L]' 将 POST 重写到我的其他后端服务器:

var connect = require('connect')
var cors = require('cors')
var http = require('http')

var app = connect()
app.use(cors());
app.use(function (req, res) {
console.log('RECEIVED', req.url, req.method);
res.end(JSON.stringify({status: 'ok'}));
});

http.createServer(app).listen(4001

所以流程如下:

1) In the browser I do a fetch/POST
2) It is received as POST and connect-modrewrite is applied
3) My second backend prints: RECEIVED /a/b GET

所以我的问题是,为什么我的 POST 转换为 GET 以及如何解决这个问题?

最佳答案

这是预期的行为。当您执行重定向 (301/302) 时,POST 数据将在重定向时被丢弃,因为客户端将对 301 指定的 URL 执行 GET 请求。

为了解决这个问题,您应该使用重定向 307。请参阅此引用:https://softwareengineering.stackexchange.com/questions/99894/why-doesnt-http-have-post-redirect#99966

关于javascript - connect-modrewrite 将我的 POST 请求更改为 GET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60987380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com