location.assign() 使用最后一个 HTTP 动词

发布于 2025-01-13 12:49:21 字数 584 浏览 0 评论 0原文

由于 HTML 表单不允许 PUT 或 DELETE 等 HTTP 请求,只允许 GET 和 POST,因此我使用 fetch API 发送 PUT 请求。然后我使用 location.assign() 以及 302 服务器响应中的 Location 标头来重定向页面。

const res = await fetch('https://example.org/test', {
    method: "PUT",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(data)
}).catch(err => console.error(err));

if (res.status >= 300 && res.status < 400) {
    window.location.assign(res.headers.get("Location"));
}

问题是新的重定向请求也是 PUT 请求,而我希望 window.location.assign 使用 GET 请求。为什么它使用之前的 HTTP 动词 PUT?我该如何防止这种情况发生?

Because HTML forms don't allow HTTP requests like PUT or DELETE, only GET and POST, I'm sending the PUT request using the fetch API. And then I'm redirecting the page using location.assign() with the Location header from the 302 server response.

const res = await fetch('https://example.org/test', {
    method: "PUT",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(data)
}).catch(err => console.error(err));

if (res.status >= 300 && res.status < 400) {
    window.location.assign(res.headers.get("Location"));
}

The problem is that the new redirected request is also a PUT request, while I would like that window.location.assign would use a GET request. Why does it use the previous HTTP verb of PUT and how can I prevent that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏雨凉 2025-01-20 12:49:21

我自己想通了。

这并不是说 window.location.assign() 使用了最后一个 HTTP 动词。 fetch() 将自动遵循重定向。它具有选项 redirect ,该选项具有默认选项“跟随”。没有一个很好的解决方案可以使用不同的 HTTP 动词来跟踪重定向,因为重定向状态基本上意味着必须通过不同的 URL 访问相同的资源。因此,最好的解决方案是让服务器响应 200 Ok 状态并给出如何访问下一页的指示。 (我只是设置了位置标题)。

I figured it out on myself.

It's not that window.location.assign() uses the last HTTP verb. It's that fetch() will automatically follow the redirects. It has the option redirect which has as default option "follow". There isn't a pretty solution to follow redirects yourself with a different HTTP verb, since the redirect status basically means that the same resource has to be accessed through a different URL. The best solution is thus to let the server respond with a status of 200 Ok and give instructions on how to access the next page. (I just set the Location header).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文