gin关于一个接口多个版本的兼容问题?
来源:5-6 登陆管理功能 - 控制器及路由定义

江湖卖药的
2020-05-17
Hi,老师您好:
你能结合接口版本讲一下吗?
1. 比如在后台管理中,我现在有一个接口有1.0.1和1.0.0这样的两个版本,同时需要兼容这么两个版本,在Register中应该怎么设置呢?
2. 如果我提供的http/rpc/tcp服务中,也有一个接口对应多个版本,同时向下兼容一个或者多个版本(也或者不向下兼容)这些该怎么处理呢?
2回答
-
江湖卖药的
提问者
2020-05-19
如果使用header头中传版本参数具体步骤如下:
router.go内容如下:
func InitRouter() *gin.Engine {
router := gin.Default()
v101 := router.Group("/1.0.1")
{
v1_0_1.ArticleRegister(v101)
}
v102 := router.Group("/1.0.2")
{
v1_0_2.ArticleRegister(v102)
v1_0_2.UserRegister(v102)
}
return router
}
controller/v1.0.1/article.go
//路由注册
func ArticleRegister(router *gin.RouterGroup) {
article := ArticleController{}
router.GET("/index", article.Index)
router.GET("/list", article.List)
}
type ArticleController struct {
}
func (article *ArticleController) Index(c *gin.Context) {
c.JSON(0, "index")
return
}
func (article *ArticleController) List(c *gin.Context) {
c.JSON(0, "list101")
return
}
controller/v1.0.2/article.go
//路由注册
func ArticleRegister(router *gin.RouterGroup) {
article := ArticleController{}
oldarc := v1_0_1.ArticleController{}
router.GET("/index", oldarc.Index)
router.GET("/list", article.List)
}
type ArticleController struct {
}
func (article *ArticleController) Index(c *gin.Context) {
c.JSON(0, "index102")
return
}
func (article *ArticleController) List(c *gin.Context) {
c.JSON(0, "list102")
return
}
如果我在新版本中list方法改变了,就如果在要新版中兼容老版本的index。在ArticleRegister中,就要把之前的index给注册进来,我觉得我这种方法不怎么爽,如果接口少了还好办,如果接口多了就想要的增加了工作量。老师有什么好的兼容版本吗?
00 -
牛儿吃草
2020-05-17
1、你可以设置一下版本url前缀,这样好处是代理逻辑隔离性好,缺点下游需要适配新地址。
比如:
原接口 /user/getInfo,新版接口是 /v1/user/getInfo
2、
你可以从接口请求参数中获取信息,比如新版本只有传了A参数才生效。好处是下游无感知,缺点是有硬编码逻辑了。012020-05-19
相似问题