使用Go完成常见的App Engine处理程序任务

这是一个最佳实践的问题,可能没有一个正确的答案。似乎我的大多数处理程序在开始特定于处理程序的工作之前,都需要执行一些常见的初始化作业。例如,用户身份验证,检测语言环境并加载转换后的字符串,检查内存缓存值等等。

在其中处理其中的一些任务似乎是合理的init,但大多数都需要使用theHttp.Request或the appengine.Context。据我所知,这留下了三个选择:

  1. 最后实现ServeHTTP并添加执行自定义init函数的功能。问题是,我将无法使用实现自己的Gorilla mux ServeHTTP

  2. 使用分支版本的多路复用器(不理想)。

  3. startHandler函数放在整个应用程序中每个处理程序的开头。似乎很麻烦,尽管我认为它使事情的发生变得很清楚,而不是“隐藏”通用代码ServeHTTP

照顾所有处理人员共有的工作的首选方式是什么?我想念另一种方法吗?


慕桂英4014372
浏览 223回答 1
1回答

慕少森

您可以创建一个 (func) 类型,它ServeHTTP可以完成您需要的所有操作,然后在内部调用原始函数,然后将您的处理程序转换为该类型:package mainimport (        "fmt"        "log"        "net/http")type wrappedHandler func(w http.ResponseWriter, r *http.Request)func (h wrappedHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {        log.Println("Do Other GAE Stuff")        h(w, r)}func handler(w http.ResponseWriter, r *http.Request) {        fmt.Fprintf(w, "Hi!")}func main() {        http.Handle("/", wrappedHandler(handler))        http.ListenAndServe(":8080", nil)}如果要将某些内容传递给handler()功能,可以将其添加到签名中,例如:type wrappedHandler func(w http.ResponseWriter, r *http.Request, conn *db.Connection)func (h wrappedHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {        conn := db.CreateConnection();        h(w, r, conn)}func handler(w http.ResponseWriter, r *http.Request, conn *db.Connection) {        data := conn.AllTheData()        fmt.Fprintf(w, data)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go