猿问

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

有没有办法挂钩 http.ResponseWriter 上的刷新/结束事件,以便执行一个处理程序,该处理程序在发送之前向编写器写入更多内容。


慕容708150
浏览 189回答 2
2回答

长风秋雁

您可以简单地包装您的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"根据新长度进行设置,然后将缓冲区的内容写入“真实“ 输出。

慕无忌1623718

你可以创建自己的http.ResponseWriter来做到这一点,或者你可以只使用“中间件模式”:// foo is the main handlertype foo struct{}func (foo) ServeHTTP(w http.ResponseWriter, r *http.Request) {    w.Write([]byte("foo"))}// bar writes after footype 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。
随时随地看视频慕课网APP

相关分类

Go
我要回答