Golang中net/http包无法获取`ServeContent`和`ServeFile`的响应状态码问题

Golang中net/http包无法获取ServeContentServeFile的响应状态码问题 我有一个自定义的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包中,ServeContentServeFile确实会直接写入响应,但不会返回状态码。不过可以通过包装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)
}

这样就能在中间件中获取到ServeContentServeFile返回的状态码(如200、304、404等)。

回到顶部