为了账号安全,请及时绑定邮箱和手机立即绑定

处理程序函数在 http.ResponseWriter 刷新/结束时执行?

处理程序函数在 http.ResponseWriter 刷新/结束时执行?

Go
慕容708150 2021-11-22 16:42:17
有没有办法挂钩 http.ResponseWriter 上的刷新/结束事件,以便执行一个处理程序,该处理程序在发送之前向编写器写入更多内容。
查看完整描述

2 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

您可以简单地包装您的HandleFunc,在包装的处理程序返回后,您可以将更多数据写入ResponseWriter:


func myhandler(w http.ResponseWriter, r *http.Request) {

    w.Write([]byte("Hello"))

}


func wrapper(w http.ResponseWriter, r *http.Request) {

    myhandler(w, r)           // Call original

    w.Write([]byte(" World")) // Write further data to output

}


func main() {

    http.HandleFunc("/", wrapper)

    http.ListenAndServe("", nil)

}

访问任何 URL 将导致响应:


Hello World

生产环境注意事项:

  • 包装器还应该检查包装处理程序的响应代码或成功,并采取行动(例如,如果提供了错误页面,则可能不希望仍然执行额外的写入)。

  • 如果"Content-length"头是由包装处理程序设置的,写入更多数据将使其无效(因为内容将大于头中指示的内容)。

针对这种情况的一种可能的“保护”可能是传递一个自定义ResponseWriter实现,该实现仅写入缓冲区(例如bytes.Buffer),包装器将附加到此并"Content-length"根据新长度进行设置,然后将缓冲区的内容写入“真实“ 输出。


查看完整回答
反对 回复 2021-11-22
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

你可以创建自己的http.ResponseWriter来做到这一点,或者你可以只使用“中间件模式”:


// foo is the main handler

type foo struct{}


func (foo) ServeHTTP(w http.ResponseWriter, r *http.Request) {

    w.Write([]byte("foo"))

}


// bar writes after foo

type bar struct {

    h http.Handler

}


func (b bar) ServeHTTP(w http.ResponseWriter, r *http.Request) {

    b.h.ServeHTTP(w, r)

    w.Write([]byte("BAR"))

}

游乐场:http : //play.golang.org/p/fB2OXNSTIe。


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信