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"
根据新长度进行设置,然后将缓冲区的内容写入“真实“ 输出。
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。
- 2 回答
- 0 关注
- 170 浏览
添加回答
举报