路由组
开发中常常会遇到一种需求:
将系统划分成多个模块,例如用户管理模块、书籍管理模块等,这些模块下各自有子模块。
在设计路由路径的时候可能就需要设置成下面的样子:
- /user/register
- /user/login
- /user/:id/info
- /user/:id/setting
- /book/add
- /book/search/:id
- /book/remove/:id
- /book/modify/:id
这样的设计虽然没有什么问题,但是不方便管理,如果突然对 user 或者 book 这个大的模块进行修改还导致所有子模块全部都要改动。
所以合理的使用 路由组 可以很好的解决这些问题。
示例
Example
| // main.go
func main() {
r := gin.Default()
// 创建 /user 路由组
userG := r.Group("/user")
// {} 是书写规范
{
userG.POST("/register", Register)
userG.POST("/login", Login)
}
// 创建 /book 路由组
bookG := r.Group("/book")
{
bookG.GET("/search/:id", SearchBook)
bookG.DELETE("/remove/:id", RemoveBook)
}
r.Run(":9090")
}
// routes.go
type UserInfo struct {
User string `form:"user"`
Pass string `form:"pass"`
}
func Register(c *gin.Context) {
var u UserInfo
c.ShouldBind(&u)
c.JSON(http.StatusOK, gin.H{ "msg": "Hello " + u.User })
}
func Login(c *gin.Context) {
var u UserInfo
c.ShouldBind(&u)
c.JSON(http.StatusOK, gin.H{ "msg": "Hello " + u.User })
}
func SearchBook(c *gin.Context) {
bookID := c.Param("id")
c.JSON(http.StatusOK, gin.H{ "msg": "ID " + bookID })
}
func RemoveBook(c *gin.Context) {
bookID := c.Param("id")
c.JSON(http.StatusOK, gin.H{ "msg": "ID " + bookID + "was removed." })
}
|
首先通过 gin.Group()
传入组的共同前缀,例如上面的 /user
、/book
,获得一个路由组对象
然后就可以像之前一样的去绑定各个子路由了。之前的 GET()
、POST()
等方法同样适用。
效果:
路由拆分和注册