【问题标题】:Exract the data from http.ResponseWritter从 http.ResponseWriter 中提取数据
【发布时间】: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 中提取数据的方法。

我错过了什么吗?

【问题讨论】:

  • 您无法提取数据,因为没有可提取的内容,它实际上已经发送给客户端。
  • 没关系,一个普通的ResponseWriter writes 发送数据到客户端,它不会无限期地缓冲所有内容。如果之前的处理程序正在流式传输大文件,您是否希望它们现在都存储在内存中?
  • ResponseWriter 是一个接口,您所能做的就是调用其中一个方法。你可以做的是实现你自己的 ResponseWriter 允许做更多的事情。
  • @MakisPapapanagiotou:如果您有 3 个可以访问数据的处理程序,那么您还没有将其写入每个处理程序之间的ResponseWriter,这听起来您已经有了一个模式来做您想做的事。默认响应编写器没有“携带”数据,这取决于您维护该上下文。把它想象成net.Conn,你不能去检查你已经写的东西。
  • @MakisPapapanagiotou:默认响应数据结构中唯一的io.ReadCloser是请求正文,与响应数据无关。写入数据通过buffo.Writer,但没有存储完整响应。

标签: go


【解决方案1】:

A ResponseWriter may not be used after the Handler.ServeHTTP method has returned. 查看文档hereResponseWriter 是一种输出通道,因此您无法从中读取任何内容。建议Here 使用io.MultiWriter,这样您就可以复制输出并记录您需要的内容。

【讨论】:

  • 但是我还没有从Handler.ServeHTTP返回。 Logger 只是另一个处理程序。它是一个链式处理程序逻辑。你可能错过了它是下一个的点。ServeHTTP 它不是最后一个
  • 我已经看过这篇文章,我也在做同样的事情,但它似乎只是在复制 Writer。 bytes.Buffer 始终为空。所以我还有一个作家,但没有实际数据。我开始认为沃尔克上面建议的可能是唯一的解决方案
猜你喜欢
  • 2017-10-03
  • 2021-10-12
  • 2014-11-25
  • 2011-04-18
  • 1970-01-01
  • 2016-09-23
  • 2020-11-03
  • 1970-01-01
  • 2014-10-12
相关资源
最近更新 更多