我通过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))
}
答案 0 :(得分:3)
正如评论中已经提到的并且在错误消息中暗示的, 您无法两次更改响应标头:
http.ServeFile(w, r, r.URL.Path[1:])
w.WriteHeader(statusCode)
将被调用。换句话说,HTTP响应将以statusCode
作为状态代码发送。singup
或http.Redirect
在致电w.WriteHeader
后发送HTTP回复。因此,应该发送哪些响应非常令人困惑。
您可能需要先检查signup
和login
,如果没有,请拨打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