猿问

如何判断 net/http 的 ResponseWriter.Write() 是否已被调用?

假设我有一个 net/http 处理程序链,一个早期的处理程序以 HTTP 错误响应(http.StatusInternalServerError例如)。如何在以下处理程序中检测到这一点,并避免向客户端发送额外数据?

或者这完全是解决问题的错误方法?


慕的地6264312
浏览 178回答 2
2回答

翻翻过去那场雪

http.ResponseWriter是一个接口。所以只需编写它的一个新实例:type MyResponseWriter struct {    http.ResponseWriter    WroteHeader bool}func (w *MyResponseWriter) Write(b []byte) (int, error) {    w.WroteHeader = true    return w.ResponseWriter.Write(b)}func (w *MyResponseWriter) WriteHeader(code int) {    w.WroteHeader = true    w.ResponseWriter.WriteHeader(code)}在你的处理程序中://...if w, ok := w.(*MyResponseWriter); ok && w.WroteHeader {    log.Println("Already wrote, skipping")    return}编辑:另一件事要考虑。大多数情况下,如果您有处理程序的“链”,则意味着在处理程序内部调用处理程序。所以如果你有类似的东西type Handler1 struct { http.Handler }type Handler2 struct { http.Handler }type Handler3 struct { http.Handler }var MyHandler http.Handler = Handler1{Handler2{Handler3{h}}}只要每个人都调用内部处理程序作为他们对wand做的最后一件事r,你应该没问题,因为那样w并且r甚至不会到达内部处理程序。例如func (h Handler2) ServeHTTP(w http.ResponseWriter, r *http.Request) {    if somethingBadHappened() {        w.WriteHeader(http.StatusInternalServerError)        return    }    h.ServeHTTP(w, r) // Not called if somethingBadHappened().}

跃然一笑

第一:可能存在更轻量级的解决方案。但是,如果您找不到,请考虑使用x/net/context允许您实现超时、截止日期,当然还有中间件链的提前终止。
随时随地看视频慕课网APP

相关分类

Go
我要回答