go - 处理 api 版本的惯用方法是什么

标签 go routes versioning

<分区>

我正在用 Go 创建一个用于移动应用程序的服务器。如果用户不更新应用程序,我需要能够支持多个版本的 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)
            }

C.拥有不变的个别网址,但基于 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 版本的惯用方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29779468/

相关文章:

go - 如何在go中删除结构对象?

go - 将带有用破折号分隔的单词的标志映射到 camel_case 配置?

Laravel 反向路由的好处

sql - 您如何对数据库架构进行版本控制?

android - 如何获取应用程序更新?

go - 如何获得时间。滴答立即滴答

file-io - 创建用于测试文件访问的大型 csv 文件

ruby - Rails 3.2.6 路线不再有效

node.js - 如何根据正则表达式指定的路径将路由器附加到 Express 应用程序?

version-control - 如何应对软件文档和软件本身的版本控制?