在golang中处理api版本的惯用方法是什么?

时间:2015-04-21 17:41:48

标签: go routes versioning

我在Golang中为移动应用创建服务器。我需要能够支持多个版本的API用于用户不更新应用程序的情况。版本控制的主要问题是以正确的格式返回移动应用程序版本的数据。

我已经看到有三种基本方法可以做到这一点  A.一种方法是在" /"上设置一个路由处理程序,然后允许该函数解析用于版本控制的URL。
   示例:

func main() {
http.HandleFunc("/", routes.ParseFullURI)
}

B中。使用像gorilla / mux这样的库来处理路由器中的模式,但是我看到了一些warnings that this can be too slow 示例:

  func main() {
            mux.HandleFunc("{version:}/", routes.ParseVersionForHome)
            mux.HandleFunc("{version:}/getData", routes.ParseVersionForGetDAta)
            mux.HandleFunc("{version:}/otherCall", routes.ParseVersionForOtherCall)
            }

℃。有个别网址不会改变,但根据标题,分成不同的版本。 示例:

func main() {
   http.HandleFunc("/", routes.ParseHeaderForVersionForHome)
   http.HandleFunc("/getData", routes.ParseHeaderForVersionForGetData)
   http.HandleFunc("/otherCall", routes.ParseHeaderForVersionForOtherCall)
}

我担心选项1代码太乱了。我担心选项2在性能方面会太慢,我担心选项3对于客户来说很难处理,或者由于版本没有明确标记而会让人感到困惑。

哪种方法最适合Golang,并且会为经常轮询的移动应用带来最佳性能?

1 个答案:

答案 0 :(得分:6)

有许多路由框架允许分组,例如使用echo(如果你想要速度,这是一个非常好的框架)

package main

import "github.com/labstack/echo"

func ping(c *echo.Context) {
        c.String(200, "pong")
}

func main() {
        e := echo.New()

        v1 := e.Group("/v1")
        v1.Get("/ping", ping)

        v2 := e.Group("/v2")
        v2.Get("/ping", ping)

        e.Run(":4444")
}

我认为这很干净。

我相信很多其他框架都允许这样做。我知道马丁尼的事实,但这不是一个习惯性的框架......