请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

gin关于一个接口多个版本的兼容问题?

Hi,老师您好:

你能结合接口版本讲一下吗?

   1. 比如在后台管理中,我现在有一个接口有1.0.1和1.0.0这样的两个版本,同时需要兼容这么两个版本,在Register中应该怎么设置呢?
   2. 如果我提供的http/rpc/tcp服务中,也有一个接口对应多个版本,同时向下兼容一个或者多个版本(也或者不向下兼容)这些该怎么处理呢? 

正在回答 回答被采纳积分+3

2回答

提问者 江湖卖药的 2020-05-19 11:38:05

如果使用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 回复 有任何疑惑可以回复我~
牛儿吃草 2020-05-17 22:14:12

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

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 江湖卖药的 #1
    这个回复的文字有限制,我自己回复了一下解决办法,老师你帮忙看看 谢谢~~~如果有好的版本也请分享一下
    回复 有任何疑惑可以回复我~ 2020-05-19 11:38:59
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号