Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go http.ResponseWriter刷新/结束时执行处理程序函数?_Go - Fatal编程技术网

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

Go http.ResponseWriter刷新/结束时执行处理程序函数?,go,Go,有没有一种方法可以钩住http.ResponseWriter上的刷新/结束事件,以便在发送之前执行一个向writer写入更多内容的处理程序。您可以创建自己的http.ResponseWriter来实现这一点,也可以使用“中间件模式”: 游乐场:。您可以简单地包装,在包装的处理程序返回后,您可以将进一步的数据写入: 访问任何URL都将导致响应: Hello World 生产环境中需要牢记的事项: 包装器还应检查响应代码或包装处理程序的成功情况,并采取行动(例如,如果提供了错误页面,则可能不希望

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

您可以创建自己的
http.ResponseWriter
来实现这一点,也可以使用“中间件模式”:

游乐场:。

您可以简单地包装,在包装的处理程序返回后,您可以将进一步的数据写入:

访问任何URL都将导致响应:

Hello World
生产环境中需要牢记的事项:

  • 包装器还应检查响应代码或包装处理程序的成功情况,并采取行动(例如,如果提供了错误页面,则可能不希望继续执行额外的写入)
  • 如果包装处理程序设置了
    “Content length”
    标题,则写入更多数据将使其无效(因为内容将大于标题中指示的内容)
针对这种情况的一种可能的“保护”可能是传递一个自定义的
ResponseWriter
实现,该实现只写入缓冲区(例如),包装器将附加到此实现,并根据新的长度设置
“Content length”
,然后将缓冲区的内容写入“real”输出

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)
}
Hello World