【问题标题】:Organize routes and helpers组织路线和助手
【发布时间】:2014-11-06 00:22:31
【问题描述】:

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

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

问题:

  1. 因为我想在一个函数中定义路由,我是否需要在这个文件中导入我的所有包,以将请求发送到正确的处理程序?

  2. helper 函数怎么样,例如,我想为所有必要的处理程序将响应的content type 设置为application/json,我将如何做到这一点?

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

【问题讨论】:

  • 我认为您可能需要从main-like 包中调用Register,该包导入所有包含视图的包(并且不被它们导入),甚至从各种包' init()s(但是,嗯,我看到了将您的路线组织在一个地方的吸引力)。如果您的帖子/评论/等,可以达到一定大小的应用程序。视图紧密集成,无论如何它们可能不需要是不同的包。这是我对有关包布局的相关 SO Q 的回答:stackoverflow.com/questions/20380333/…
  • 似乎 JSON 内容类型/编码的东西基本上是一个实用功能,可能由定义视图的包导入。所以:“顶部”上的路线,“底部”上的实用程序。实际上有一篇很棒的博客文章(比如“我们如何在没有框架的情况下使用 Go”)涵盖了他们如何处理这个问题以及其他一些小事情;不过我找不到。
  • 如果有人可以找到“我们如何在没有框架的情况下使用 Go”的帖子,我会永远爱你。我有点记得他们编写自己的包装器来进行 JSON 编码/解码,但我现在真的找不到。

标签: go


【解决方案1】:

如果您在单个函数中定义所有路由,则包含此函数的文件将需要导入实现处理程序的包。在另一个包中引用类型或函数的唯一方法是导入包。

这是设置内容类型并将值编码为 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。

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多