我开始在go(golang)中构建api,但我几乎没有问题......
所以在我的main函数或init函数中(因为我可能会使用appengine)我正在考虑调用一个函数来定义使用gorilla mux的所有路由。我的应用程序的每个部分(帖子,评论等......)都有一个包含其结构/方法/功能的包。
问题:
因为我在考虑在一个函数中定义路由,我是否需要在此文件中导入我的所有包,以将请求发送给右边的处理程序?
辅助函数如何,例如我想将响应的content type
设置为application/json
所有需要的处理程序,我将如何做到这一点
我不是在寻找框架,只是关于如何以golang方式克服这些问题的一些指针。
答案 0 :(得分:2)
如果在单个函数中定义所有路由,则包含此函数的文件将需要导入实现处理程序的包。引用另一个包中的类型或函数的唯一方法是导入包。
这是一个帮助器,用于设置内容类型并将值编码为JSON:
func JSONHandler(f func(w http.ResponseWriter, r *http.Request) interface{}) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
v := f(w, r)
if v != nil {
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(v); err != nil {
log.Println(err)
}
}
})
}
此函数的参数是一个函数,它返回一个值以作为JSON编码到响应中。例如,此函数将客户端的用户代理作为JSON返回。
func UserAgentHandler(w http.ResponseWriter, r *http.Request) interface{} {
return struct { UserAgent string }{ req.Header.Get("User-Agent") }
}
使用以下代码向Gorilla mux r
注册此处理程序:
r.Handle("/user-agent", JSONHandler(UserAgentHandler))
有很多方法可以改进JSONHandler。