为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 GET 请求重定向到带有某些数据的 POST 请求?

如何将 GET 请求重定向到带有某些数据的 POST 请求?

Go
暮色呼如 2023-05-04 17:01:49
当用户使用 GET 请求访问某个 URL 时,我想将他们重定向到另一个位置的 POST 请求。package mainimport (    "bytes"    "fmt"    "io/ioutil"    "log"    "net/http"    "net/url")func old(w http.ResponseWriter, r *http.Request) {    newURL := "/new"    var bdy = []byte(`title=Buy cheese and bread for breakfast.`)    r.Method = "POST"    r.URL, _ = url.Parse(newURL)    r.RequestURI = newURL    r.Body = ioutil.NopCloser(bytes.NewReader(bdy))    r.Header.Set("Content-Type", "application/x-www-form-urlencoded")    http.Redirect(w, r, newURL, 302)}func new(w http.ResponseWriter, r *http.Request) {    r.ParseForm()    fmt.Printf("Method:%v\n", r.Method)    fmt.Printf("Title:%v\n", r.Form.Get("title"))}func main() {    http.HandleFunc("/", old)    http.HandleFunc("/new", new)    port := 8000    fmt.Printf("listening on %v\n", port)    if err := http.ListenAndServe(fmt.Sprintf(":%v", port), nil); err != nil {        log.Fatal("ListenAndServe: ", err)    }}当我点击“/”时,我最终被重定向到“/new”但是有一个 GET 请求并且没有表单数据:Method:GETTitle:如果我直接卷曲“/新”,我会得到:curl -XPOST localhost:8000/new -d "title=Buy cheese and bread for breakfast."Method:POSTTitle:Buy cheese and bread for breakfast.
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

不幸的是,我不认为重定向可以更改动词(例如,,GETPOST或向请求添加数据。它只能更改 URL。

查看完整回答
反对 回复 2023-05-04
?
潇湘沐

TA贡献1816条经验 获得超6个赞

HTTP 重定向(即回复状态码 301、302、307,308 和Location标头)只能将现有请求重定向到另一个位置,而不会更改请求的有效负载。不过,它可以在响应标头中添加一些 cookie。

为了自动将 GET 请求更改为具有特定有效负载的 POST 请求,您可以尝试向客户端发送一个带有<form method=POST...隐藏输入字段的 HTML 页面和有效负载,即<input name=... value=... type=hidden>然后将一些 JavaScript 添加到自动提交表单的页面. 但是这种黑客攻击只能在浏览器中运行,并且只有在启用了 JavaScript 的情况下才能运行,并且也不适用于所有类型的有效负载。

为了与更广泛的客户端保持兼容性,最好以不同的方式设计它,即在重定向中保留 GET 请求,但将必要的有效负载作为参数提供给新目标,即http://new.target/foo?payload=..... 但细节取决于请求的目标可以处理什么。


查看完整回答
反对 回复 2023-05-04
?
慕的地10843

TA贡献1785条经验 获得超8个赞

我从未听说过将动词从 GET 更改为 POST。我想这是不可能的,因为 POST 假定 body of body(但可能是空的)而 GET 则不然。所以在一般情况下,浏览器将无法从无到有地获取正文。否则是可能的:您可以在 post 后发送 302 重定向以使浏览器执行 get。动词也可以与 307 回复代码一起保留。

尝试重新考虑浏览器与服务器的交互。也许您可以将 POST 重定向到另一个位置来解决任务?


查看完整回答
反对 回复 2023-05-04
  • 3 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信