处理 api 版本的惯用方法是什么
What is the idiomatic way to handle api versions
我正在用 Go 创建一个用于移动应用程序的服务器。我需要能够支持 API 的多个版本,以应对用户不更新应用程序的情况。版本控制的主要问题是 return 数据以适合移动应用程序版本的正确格式。
我看到有三种基本方法可以做到这一点。
A. 一种方法是在“/”上设置一个路由处理程序,然后允许该函数解析 url 以进行版本控制。
示例:
func main() {
http.HandleFunc("/", routes.ParseFullURI)
}
乙。使用 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)
}
C。有个别 url 不变,但基于 header,分成不同的版本。
示例:
func main() {
http.HandleFunc("/", routes.ParseHeaderForVersionForHome)
http.HandleFunc("/getData", routes.ParseHeaderForVersionForGetData)
http.HandleFunc("/otherCall", routes.ParseHeaderForVersionForOtherCall)
}
我担心选项 1 的代码过于混乱。我担心选项 2 的性能太慢,我担心选项 3 对客户来说很难处理,或者因为版本没有明确标记而变得混乱。
哪种方法最适合 Go,并且对于经常轮询的移动应用程序来说性能最好?
有许多允许分组的路由框架,例如 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")
}
我觉得这个挺干净的
我相信许多其他框架都允许这样做。我知道马提尼的确如此,但这不是惯用的框架...
我正在用 Go 创建一个用于移动应用程序的服务器。我需要能够支持 API 的多个版本,以应对用户不更新应用程序的情况。版本控制的主要问题是 return 数据以适合移动应用程序版本的正确格式。
我看到有三种基本方法可以做到这一点。
A. 一种方法是在“/”上设置一个路由处理程序,然后允许该函数解析 url 以进行版本控制。
示例:
func main() {
http.HandleFunc("/", routes.ParseFullURI)
}
乙。使用 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)
}
C。有个别 url 不变,但基于 header,分成不同的版本。 示例:
func main() {
http.HandleFunc("/", routes.ParseHeaderForVersionForHome)
http.HandleFunc("/getData", routes.ParseHeaderForVersionForGetData)
http.HandleFunc("/otherCall", routes.ParseHeaderForVersionForOtherCall)
}
我担心选项 1 的代码过于混乱。我担心选项 2 的性能太慢,我担心选项 3 对客户来说很难处理,或者因为版本没有明确标记而变得混乱。
哪种方法最适合 Go,并且对于经常轮询的移动应用程序来说性能最好?
有许多允许分组的路由框架,例如 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")
}
我觉得这个挺干净的
我相信许多其他框架都允许这样做。我知道马提尼的确如此,但这不是惯用的框架...