组织路线和帮助

时间:2014-09-11 22:16:31

标签: go

我开始在go(golang)中构建api,但我几乎没有问题......

所以在我的main函数或init函数中(因为我可能会使用appengine)我正在考虑调用一个函数来定义使用gorilla mux的所有路由。我的应用程序的每个部分(帖子,评论等......)都有一个包含其结构/方法/功能的包。

问题:

  1. 因为我在考虑在一个函数中定义路由,我是否需要在此文件中导入我的所有包,以将请求发送给右边的处理程序?

  2. 辅助函数如何,例如我想将响应的content type设置为application/json所有需要的处理程序,我将如何做到这一点

  3. 我不是在寻找框架,只是关于如何以golang方式克服这些问题的一些指针。

1 个答案:

答案 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。