在简单的 Go HTTP 程序中编写多个标头
Go 的 net/http 包中的一个常见问题是遇到错误“multiple response. WriteHeader 调用。”当多个标头写入同一个 HTTP 响应时,就会发生这种情况。
考虑以下代码片段:
import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }) fmt.Println("Starting Server...") log.Fatal(http.ListenAndServe(":5678", nil)) } func HandleIndex(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) w.Write([]byte("Hello, World!")) }
在 Chrome 中通过 localhost:5678 运行和访问时,控制台显示:
Starting Server... / 2015/01/15 13:41:29 http: multiple response.WriteHeader calls /favicon.ico 2015/01/15 13:41:29 http: multiple response.WriteHeader calls
多个标头的原因编写
此错误的关键在于用作请求处理程序的匿名函数:
func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }
此函数打印 URL,生成一个调用 HandleIndex() 的新 goroutine ,并继续执行。如果处理函数在第一次 Write 调用之前未设置响应状态,Go 会自动将其设置为 200 (HTTP OK)。但是,如果处理程序完成后没有写入响应,Go 仍会将状态设置为 200。
在这种情况下,匿名函数不会设置状态并且不写入任何内容,因此 Go 将状态设置为 200。
Goroutine 和多头写入
当调用 HandleIndex() 时一个单独的 goroutine,原始匿名函数完成并设置响应头。同时,新的 goroutine 也设置了 header,导致错误。
解决方案
要解决此错误,请删除 go 关键字以在其中调用 HandleIndex()原始 goroutine 或在匿名函数中显式设置响应状态。
以上是为什么我的Go HTTP程序显示'http:多个response.WriteHeader调用”?的详细内容。更多信息请关注PHP中文网其他相关文章!