2017-02-21 17 views
0

В настоящее время я работаю над API с Go + Gin.Как добавить несколько групп в gin routing для наследования версии api?

API-интерфейс должен включать строку версии, например строку v1

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

Это не проблема, потому что я могу создать группу с Gin

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

Но ... если я запустите новую версию API «v2», а код в функции UserGetUsername не изменился. Я должен сделать следующее:

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

Есть ли лучше решение для этого - может быть что-то вроде этого:

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

Спасибо за ваши предложения.

+0

Другой подход можно взять с собой: включать только функцию в определенной версии API, если это совершенно новое или его поведение изменилось с предыдущей версии , –

ответ

1

Я не думаю, что Джин предоставляет это, но он выглядит легко писать.

type GroupGroup struct { 
    groups []*gin.RouterGroup 
} 

func NewGroupGroup(groups []*gin.RouterGroup) GroupGroup { 
    return GroupGroup { 
     groups, 
    } 
} 

func (g *GroupGroup) handle(method string, path string, handler gin.HandlerFunc) { 
    for _, group := range g.groups { 
     group.Handle(method, path, handler) 
    } 
} 

Затем, вы можете использовать его так:

v1 := router.Group("/v1") 
v2 := router.Group("/v2") 

g := NewGroupGroup([]*gin.RouterGroup { v1, v2 }) 

g.handle(http.MethodGet, "hello", sayHello) 
g.handle(http.MethodPost, "goodbye", sayGoodbye) 
+0

Большое спасибо - это действительно приятное решение! – Berti92