使用Golang的net/http https://golang.org/pkg/net/http/包裹,我如何检查是否ResponseWriter
已写至?我收到以下错误消息:
http:多个response.WriteHeader调用
当然,我可以从我的函数中返回布尔值等,指示我写给的天气ResponseWriter
使用重定向或其他东西,我尝试过,但我肯定能够检查是否ResponseWriter
在我用简单的方法写入之前已经被写入了。
我正在寻找一个类似于以下内容的函数,我可以在写入之前使用它ResponseWriter
:
if w.Header().Get("Status-Code") == "" {
http.Redirect(w, r, "/", http.StatusSeeOther)
} else {
fmt.Println("Response Writer has already been written to.")
}
上面的代码似乎不起作用...任何人都知道如何检查ResponseWriter
已写入或未写入?
执行此操作的唯一方法是使用自定义实现http.ResponseWriter
:
type doneWriter struct {
http.ResponseWriter
done bool
}
func (w *doneWriter) WriteHeader(status int) {
w.done = true
w.ResponseWriter.WriteHeader(status)
}
func (w *doneWriter) Write(b []byte) (int, error) {
w.done = true
return w.ResponseWriter.Write(b)
}
func myMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
dw := &doneWriter{ResponseWriter: w}
next.ServeHTTP(dw, r)
if dw.done {
// Something already wrote a response
return
}
// Nothing else wrote a response
w.WriteHeader(http.StatusOK)
// Whatever you want here
}
}
我也一起扔了一个简单的包 https://godoc.org/github.com/flimzy/donewriter为我处理这件事。如果您愿意,也可以随意使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)