代码之家  ›  专栏  ›  技术社区  ›  user_78361084

如何将GET请求重定向到包含一些数据的POST请求?

go
  •  0
  • user_78361084  · 技术社区  · 5 年前

    当用户通过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.
    
    3 回复  |  直到 5 年前
        1
  •  4
  •   Steffen Ullrich    5 年前

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

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

    http://new.target/foo?payload=.... . 但是细节取决于请求的目标可以处理什么。

        2
  •  2
  •   poy    5 年前

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

    Redirect () 更多信息。

        3
  •  0
  •   Eugene Lisitsky    5 年前

    我从没听说过把动词从GET改为POST。我想这是不可能的,因为POST假设body的body(但是可能是空的),GET不这样做,所以一般情况下浏览器不能从任何地方获取body。

    尝试重新考虑浏览器与服务器的交互。可能是你可以将帖子重定向到另一个位置来解决一个任务?