如何处理API版本的惯用方式

6
我正在使用Go语言创建一个服务器,用于移动应用。我需要支持多个API版本,以防用户不更新应用程序。版本控制的主要问题是为移动应用程序的版本返回正确格式的数据。
我发现有三种基本方法来实现这一点。 A. 一种方法是在“ /”上有一个路由处理程序,然后允许该函数解析URL进行版本控制。 例如:
func main() {
http.HandleFunc("/", routes.ParseFullURI)
}

B. 使用诸如gorilla/mux之类的库来处理路由器中的模式,但我看到一些警告称这可能会太慢
示例:

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

C. 拥有不变的个别URL,但根据标头分成不同版本。

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

我担心选项1的代码会太混乱。我担心选项2的性能会太慢,而我也担心选项3对客户来说会很难处理,或者由于版本没有明确标记而变得令人困惑。
哪种方法对于Go来说是最符合惯例的,并且将为经常轮询的移动应用程序带来最佳性能?

2
如果你在谈论HTTP(S)上的API,那么像http://example.com/api/v1/…这样的东西很常见。或者你更想知道如何在Go服务器中实现这样的模式? - Dave C
我正在询问如何在Go服务器上进行操作。我会在我的问题中进一步解释。 - Avik
1
许多路由器都允许对不同的路由进行分组。你可能想要研究一下这个功能。 - placeybordeaux
3
不要对路由器速度感到惊慌。在 https://github.com/julienschmidt/go-http-routing-benchmark,您可以看到“路由单个请求”基准测试的时间(以纳秒为单位),如同微秒、千分之一毫秒。与数据库写入相比,这个代价非常小,难以通过直觉理解。 - twotwotwo
2
我认为echo是一个很棒的成就!看到一个非平凡的、不分配组件真是太酷了。但我不希望任何人觉得他们必须使用它才能获得良好的API性能。 - twotwotwo
显示剩余6条评论
1个回答

5

有许多路由框架可以进行分组,例如使用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")
}

我认为这非常简洁明了。

我相信许多其他框架也可以实现此功能。我知道martini确实可以,但那不是一个惯用的框架...


谢谢。现在我只需要找到最适合我的需求的库,但这似乎是Go中版本控制最常见的方法。支持分组且速度快的库列表似乎几乎无穷无尽! - Avik
嗨,我一直在搜索网络,但很难理解ping是否是相同的函数,如果是,我该如何区分哪个组调用它以返回不同的结果。 - Avik
Ping是相同的功能。从ping的上下文中,您可以查找给定的URL。我假设您会为不同的版本调用不同的函数。 - placeybordeaux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接