我们开发功能的时候都是分模块的,比如用户处理模块、商品处理模块、日志处理模块.....
那么我们的路由也是可以分组的:比如我们的用户模块
http://localhost:8000/user/register
http://localhost:8000/user/login
http://localhost:8000/user/info
http://localhost:8000/user/loginout
从这几个访问连接中可以知道,都是处理用户user的url
在gin框架中,能对路由进行分类
engine.Group("/user") 返回的是user路由组,它是一个结构体指针
RouterGroup结构体中就包含 Engine,Handlers
代码示例:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
routerGroup := engine.Group("/user")
routerGroup.POST("/register", RegisterHandler) //用户注册
routerGroup.POST("/login", LoginHandler) //用户登录
routerGroup.GET("/userinfo", UserinfoHandler) //用户信息
engine.Run(":8000")
}
//RegisterHandler 用户注册
func RegisterHandler(context *gin.Context) {
fullPath := "用户注册:"+context.FullPath()
fmt.Println(fullPath)
context.Writer.WriteString(fullPath)
}
//LoginHandler 用户登录
func LoginHandler(context *gin.Context) {
fullPath := "用户登录:"+context.FullPath()
fmt.Println(fullPath)
context.Writer.WriteString(fullPath)
}
//UserinfoHandler 用户信息
func UserinfoHandler(context *gin.Context) {
fullPath := "用户信息:"+context.FullPath()
fmt.Println(fullPath)
context.Writer.WriteString(fullPath)
}
我们的实际项目中,路由分组并不是像如上的示例进行分组,根据mvc的分层,那么每个功能模块会对应一个controller文件(比如说UserController,定义UserController结构体和对应的handler方法),而我们的main中可以定义一个函数注册各功能模块路由组的函数,通过将不同路由组的routerGroup传参给XxxController,在XxxController中去对应各个请求路径的handler方法。
项目目录:
ginobj/main.go
ginobj/controller/userController.go
package main
import (
"ginobj/controller"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
RegisterRout(engine)
engine.Run(":8000")
}
//RegisterRout 注册各模块的路由组
func RegisterRout(engine *gin.Engine) {
userRout := engine.Group("/user")
new(controller.UserController).CreatRout(userRout)
}
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
)
type UserController struct{
}
func (u *UserController) CreatRout(routeGroup *gin.RouterGroup) {
routeGroup.POST("/register",u.RegisterHandler)
routeGroup.POST("/login",u.LoginHandler)
routeGroup.GET("/userinfo",u.UserinfoHandler)
}
//RegisterHandler 用户注册
func(u *UserController) RegisterHandler(context *gin.Context) {
fullPath := "用户注册:"+context.FullPath()
fmt.Println(fullPath)
context.Writer.WriteString(fullPath)
}
//LoginHandler 用户登录
func (u *UserController)LoginHandler(context *gin.Context) {
fullPath := "用户登录:"+context.FullPath()
fmt.Println(fullPath)
context.Writer.WriteString(fullPath)
}
//UserinfoHandler 用户信息
func (u *UserController)UserinfoHandler(context *gin.Context) {
fullPath := "111用户信息:"+context.FullPath()
fmt.Println(fullPath)
context.Writer.WriteString(fullPath)
}
请求结果(post请求用postman即可,没有提供示例结果)
当然,如上的路由分组并不能明确看到路由列表,那么可以将路由绑定handler处理放到main的注册路由函数中