如何将多个组添加到gin路由中以实现API版本继承?

huangapple go评论114阅读模式
英文:

How to add multiple groups to gin routing for api version inheritance?

问题

我目前正在使用Go + Gin开发一个API。

API应该包括一个版本字符串,例如字符串v1

  1. http://127.0.0.1:3000/v1/user/get_username

这没有问题,因为我可以使用Gin创建一个组

  1. v1 := router.Group("/v1")
  2. v1.GET("/user/get_username", modules.UserGetUsername)

但是...如果我启动一个新的API版本"v2",并且函数UserGetUsername中的代码没有改变,我必须执行以下操作

  1. v1 := router.Group("/v1")
  2. v1.GET("/user/get_username", modules.UserGetUsername)
  3. v2 := router.Group("/v2")
  4. v2.GET("/user/get_username", modules.UserGetUsername)

有没有更好的解决方案 - 也许像这样:

  1. v1_v2 := router.Group("/v1").AnotherGroup("/v2")
  2. v1_v2.GET("/user/get_username", modules.UserGetUsername)

谢谢你的建议。

英文:

I'm currently working on a API with Go + Gin.

The API should include a version string, for example the string v1

  1. http://127.0.0.1:3000/v1/user/get_username

That is no problem, because I can create a group with Gin

  1. v1 := router.Group("/v1")
  2. v1.GET("/user/get_username", modules.UserGetUsername)

But... if I start a new API-Version "v2" and the code within the function UserGetUsername didn't changed I must do the following

  1. v1 := router.Group("/v1")
  2. v1.GET("/user/get_username", modules.UserGetUsername)
  3. v2 := router.Group("/v2")
  4. v2.GET("/user/get_username", modules.UserGetUsername)

Is there a nicer solution for that - maybe something like that:

  1. v1_v2 := router.Group("/v1").AnotherGroup("/v2")
  2. v1_v2.GET("/user/get_username", modules.UserGetUsername)

Thank you for your suggestions.

答案1

得分: 11

我不认为Gin提供这个功能,但编写起来很容易。

  1. type GroupGroup struct {
  2. groups []*gin.RouterGroup
  3. }
  4. func NewGroupGroup(groups []*gin.RouterGroup) GroupGroup {
  5. return GroupGroup {
  6. groups,
  7. }
  8. }
  9. func (g *GroupGroup) handle(method string, path string, handler gin.HandlerFunc) {
  10. for _, group := range g.groups {
  11. group.Handle(method, path, handler)
  12. }
  13. }

然后,你可以这样使用:

  1. v1 := router.Group("/v1")
  2. v2 := router.Group("/v2")
  3. g := NewGroupGroup([]*gin.RouterGroup { v1, v2 })
  4. g.handle(http.MethodGet, "hello", sayHello)
  5. g.handle(http.MethodPost, "goodbye", sayGoodbye)
英文:

I don’t think Gin provides this, but it looks easy to write.

  1. type GroupGroup struct {
  2. groups []*gin.RouterGroup
  3. }
  4. func NewGroupGroup(groups []*gin.RouterGroup) GroupGroup {
  5. return GroupGroup {
  6. groups,
  7. }
  8. }
  9. func (g *GroupGroup) handle(method string, path string, handler gin.HandlerFunc) {
  10. for _, group := range g.groups {
  11. group.Handle(method, path, handler)
  12. }
  13. }

Then, you can use it like so :

  1. v1 := router.Group("/v1")
  2. v2 := router.Group("/v2")
  3. g := NewGroupGroup([]*gin.RouterGroup { v1, v2 })
  4. g.handle(http.MethodGet, "hello", sayHello)
  5. g.handle(http.MethodPost, "goodbye", sayGoodbye)

huangapple
  • 本文由 发表于 2017年2月22日 00:56:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/42373423.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定