【发布时间】:2021-06-23 12:43:16
【问题描述】:
我可能遗漏了一些明显的东西,但我正在尝试提取在链接处理程序返回后已经写入的数据。
func Logger(next http.Handler, name string) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r)
log.Debug(
fmt.Sprintf("%s %s %s %s",
r.Method,
r.RequestURI,
name,
time.Since(start)),
)
})
}
next.ServeHTTP 函数返回后,我已经有了数据,我只想在记录整个请求之前检查响应中的一些值。 我找不到从 http.ResponseWriter 中提取数据的方法。
我错过了什么吗?
【问题讨论】:
-
您无法提取数据,因为没有可提取的内容,它实际上已经发送给客户端。
-
没关系,一个普通的
ResponseWriterwrites 发送数据到客户端,它不会无限期地缓冲所有内容。如果之前的处理程序正在流式传输大文件,您是否希望它们现在都存储在内存中? -
ResponseWriter 是一个接口,您所能做的就是调用其中一个方法。你可以做的是实现你自己的 ResponseWriter 允许做更多的事情。
-
@MakisPapapanagiotou:如果您有 3 个可以访问数据的处理程序,那么您还没有将其写入每个处理程序之间的
ResponseWriter,这听起来您已经有了一个模式来做您想做的事。默认响应编写器没有“携带”数据,这取决于您维护该上下文。把它想象成net.Conn,你不能去检查你已经写的东西。 -
@MakisPapapanagiotou:默认响应数据结构中唯一的
io.ReadCloser是请求正文,与响应数据无关。写入数据通过buffo.Writer,但没有存储完整响应。
标签: go