猿问

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

当用户使用 GET 请求访问某个 URL 时,我想将他们重定向到另一个位置的 POST 请求。


package main



import (

    "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:GET

Title:

如果我直接卷曲“/新”,我会得到:


curl -XPOST localhost:8000/new -d "title=Buy cheese and bread for breakfast."


Method:POST

Title:Buy cheese and bread for breakfast.


暮色呼如
浏览 179回答 3
3回答

富国沪深

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

潇湘沐

HTTP 重定向(即回复状态码 301、302、307,308 和Location标头)只能将现有请求重定向到另一个位置,而不会更改请求的有效负载。不过,它可以在响应标头中添加一些 cookie。为了自动将 GET 请求更改为具有特定有效负载的 POST 请求,您可以尝试向客户端发送一个带有<form method=POST...隐藏输入字段的 HTML 页面和有效负载,即<input name=... value=... type=hidden>然后将一些 JavaScript 添加到自动提交表单的页面.&nbsp;但是这种黑客攻击只能在浏览器中运行,并且只有在启用了 JavaScript 的情况下才能运行,并且也不适用于所有类型的有效负载。为了与更广泛的客户端保持兼容性,最好以不同的方式设计它,即在重定向中保留 GET 请求,但将必要的有效负载作为参数提供给新目标,即http://new.target/foo?payload=.....&nbsp;但细节取决于请求的目标可以处理什么。

慕的地10843

我从未听说过将动词从 GET 更改为 POST。我想这是不可能的,因为 POST 假定 body of body(但可能是空的)而 GET 则不然。所以在一般情况下,浏览器将无法从无到有地获取正文。否则是可能的:您可以在 post 后发送 302 重定向以使浏览器执行 get。动词也可以与 307 回复代码一起保留。尝试重新考虑浏览器与服务器的交互。也许您可以将 POST 重定向到另一个位置来解决任务?
随时随地看视频慕课网APP

相关分类

Go
我要回答