重定向到Go中的页面问题

时间:2017-08-31 07:06:52

标签: go ibm-cloud

我通过go服务index.html。但是,根据将通过页面发送的某些参数,go应该成功重定向到其他页面。我在尝试执行代码时遇到以下错误。

http:多个response.WriteHeader调用

func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

    http.ServeFile(w, r, r.URL.Path[1:])
    fmt.Println(r.FormValue("login"))

    if r.FormValue("signup") == "signup" {
        signup(w, r)
    } else if r.FormValue("login") == "login" {
        if login(w, r) {
            if r.Method == "POST" {
                fmt.Println("I m here")
                http.Redirect(w, r, "http://localhost:8080/home.html" (http://localhost:8080/home.html') , http.StatusSeeOther)
            }

        }

    }

})
var port string
if port = os.Getenv("PORT"); len(port) == 0 {
    port = DEFAULT_PORT
}
log.Fatal(http.ListenAndServe(":"+port, nil))
}

1 个答案:

答案 0 :(得分:3)

正如评论中已经提到的并且在错误消息中暗示的, 您无法两次更改响应标头:

  • 在某个时间点调用http.ServeFile(w, r, r.URL.Path[1:]) w.WriteHeader(statusCode)将被调用。换句话说,HTTP响应将以statusCode作为状态代码发送。
  • singuphttp.Redirect在致电w.WriteHeader后发送HTTP回复。

因此,应该发送哪些响应非常令人困惑。 您可能需要先检查signuplogin,如果没有,请拨打http.ServeFile

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.FormValue("login"))
    switch {
    case r.FormValue("signup") == "signup":
        signup(w, r)
    case r.FormValue("login") == "login" && login(w,r):
        if r.Method == "POST" {
            fmt.Println("I m here")
            http.Redirect(w, r, "http://localhost:8080/home.html" (http://localhost:8080/home.html') , http.StatusSeeOther)
    default:
        http.ServeFile(w, r, r.URL.Path[1:])
    }
})

有关why WriteHeader is warning you about this

a probably duplicated thread的更多信息