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给注册进来,我觉得我这种方法不怎么爽,如果接口少了还好办,如果接口多了就想要的增加了工作量。老师有什么好的兼容版本吗? 


0
0

牛儿吃草

2020-05-17

1、你可以设置一下版本url前缀,这样好处是代理逻辑隔离性好,缺点下游需要适配新地址。

比如:
原接口 /user/getInfo,新版接口是 /v1/user/getInfo

2、
你可以从接口请求参数中获取信息,比如新版本只有传了A参数才生效。好处是下游无感知,缺点是有硬编码逻辑了。

0
1
江湖卖药的
这个回复的文字有限制,我自己回复了一下解决办法,老师你帮忙看看 谢谢~~~如果有好的版本也请分享一下
2020-05-19
共1条回复

(打造简历金牌项目)Vue+Go 开发企业级微服务网关项目

简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关

1316 学习 · 352 问题

查看课程