2017-02-21 16 views
0

我目前正在使用Go +杜松子酒開發API。如何添加多個組到杜松子酒路由爲api版本繼承?

的API應該包括一個版本字符串,例如串V1

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

也就是沒有問題的,因爲我可以創建一個組,杜松子酒

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