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

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

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

Go
慕桂英4014372 2021-04-29 17:19:50
这是一个最佳实践的问题,可能没有一个正确的答案。似乎我的大多数处理程序在开始特定于处理程序的工作之前,都需要执行一些常见的初始化作业。例如,用户身份验证,检测语言环境并加载转换后的字符串,检查内存缓存值等等。在其中处理其中的一些任务似乎是合理的init,但大多数都需要使用theHttp.Request或the appengine.Context。据我所知,这留下了三个选择:最后实现ServeHTTP并添加执行自定义init函数的功能。问题是,我将无法使用实现自己的Gorilla mux ServeHTTP。使用分支版本的多路复用器(不理想)。将startHandler函数放在整个应用程序中每个处理程序的开头。似乎很麻烦,尽管我认为它使事情的发生变得很清楚,而不是“隐藏”通用代码ServeHTTP。照顾所有处理人员共有的工作的首选方式是什么?我想念另一种方法吗?
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

您可以创建一个 (func) 类型,它ServeHTTP可以完成您需要的所有操作,然后在内部调用原始函数,然后将您的处理程序转换为该类型:


package main


import (

        "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)

}


查看完整回答
反对 回复 2021-05-31
  • 1 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

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