【问题标题】:How to check if ResponseWriter has been written如何检查 ResponseWriter 是否已写入
【发布时间】:2019-06-28 18:43:38
【问题描述】:

使用 Golang 的 net/http 包,我如何检查 ResponseWriter 是否已写入?我收到以下错误消息:

http:多个响应。WriteHeader 调用

当然,我可以从我的函数中返回布尔值等指示天气,我通过重定向或其他方式写给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 go httpresponse


【解决方案1】:

做到这一点的唯一方法是使用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
    }
}

我还拼凑了a simple package 来为我处理这个问题。如果您愿意,也可以随意使用它。

【讨论】:

    猜你喜欢
    • 2020-07-30
    • 2021-09-30
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多