Golang中net/http包无法获取`ServeContent`和`ServeFile`的响应状态码问题
Golang中net/http包无法获取ServeContent和ServeFile的响应状态码问题
我有一个自定义的HTTP处理器。当客户端请求静态资源时,服务器端会调用 net/http 包中的 ServeContent() 或 ServeFile()。
我还想像Nginx那样,记录这两个函数生成的响应状态码。
但似乎无法从服务器端获取结果状态码。有什么建议吗?
2 回复
实现 ResponseWriter 来进行日志记录,并转发到你原始的 ResponseWriter。
更多关于Golang中net/http包无法获取`ServeContent`和`ServeFile`的响应状态码问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go的net/http包中,ServeContent和ServeFile确实会直接写入响应,但不会返回状态码。不过可以通过包装http.ResponseWriter来捕获状态码。以下是一个实现示例:
type statusRecorder struct {
http.ResponseWriter
status int
}
func (r *statusRecorder) WriteHeader(status int) {
r.status = status
r.ResponseWriter.WriteHeader(status)
}
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
recorder := &statusRecorder{ResponseWriter: w, status: 200}
next.ServeHTTP(recorder, r)
log.Printf("请求 %s 返回状态码: %d", r.URL.Path, recorder.status)
})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "./static"+r.URL.Path)
})
server := &http.Server{
Handler: loggingMiddleware(mux),
Addr: ":8080",
}
server.ListenAndServe()
}
这个实现创建了一个自定义的statusRecorder结构体,它包装了原始的http.ResponseWriter并重写了WriteHeader方法,从而能够捕获设置的状态码。中间件会在请求处理完成后记录状态码。
对于ServeContent也是同样的用法:
func serveContentHandler(w http.ResponseWriter, r *http.Request) {
file, err := os.Open("example.txt")
if err != nil {
http.Error(w, "文件未找到", http.StatusNotFound)
return
}
defer file.Close()
http.ServeContent(w, r, "example.txt", time.Now(), file)
}
这样就能在中间件中获取到ServeContent和ServeFile返回的状态码(如200、304、404等)。

