1.路由
1.1 路由分组
func main() {
// 1.创建路由
r := gin.Default()
// 2.绑定路由规则,执行的函数
// 分组路由
demo := r.Group("/demo")
{
demo.GET("/user", func (c *gin.Context) {
c.String(200, "api List")
})
demo.GET("/user/:id", func (c *gin.Context) {
c.String(200, "api List")
})
demo.POST("/user/:id", func (c *gin.Context) {
c.String(200, "api List")
})
}
// 3.监听端口,默认8080
err := r.Run(":8080") // 8080 监听8080端口
if err != nil {
panic(err)
}
}
1.2 路由分离
新建文件/router/router.go
package routes
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func InitRouter(r *gin.Engine) {
r.GET("/log", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "hello world"})
})
// api路由组
api := r.Group("/api")
{
api.GET("/users", func(c *gin.Context) {
// 处理请求
c.String(http.StatusOK, "get成功")
})
api.POST("/users", func(c *gin.Context) {
// 处理请求
c.JSON(200, gin.H{
"username": "linjing",
"password": "123456",
})
})
}
// dlc路由组
dlc := r.Group("/dlc")
{
dlc.GET("/demo", func(c *gin.Context) {
c.JSON(200, gin.H{
"data": "list",
"ret": 200,
"msg": "请求成功",
})
})
}
}
func main() {
// 1.创建路由
r := gin.Default()
// 2.绑定路由规则,执行的函数
routes.InitRouter(r) // main函数中调用
// 3.监听端口,默认8080
err := r.Run(":8080") // 8080 监听8080端口
if err != nil {
panic(err)
}
}
2.自定义控制器
2.1 控制器分组
新建controller\api\userController.go
package api
import "github.com/gin-gonic/gin"
func UserIndex(c *gin.Context) {
c.String(200, "api UserIndex")
}
func UserAdd(c *gin.Context) {
c.String(200, "api UserAdd")
}
func UserList(c *gin.Context) {
c.String(200, "api UserList")
}
func UserDelete(c *gin.Context) {
c.String(200, "api UserDelete")
}
在/router/router.go中调用userController.go的函数
// 分组路由
demo := r.Group("/demo")
{
demo.GET("/user", api.UserIndex)
demo.GET("/user/:id", api.UserList)
demo.POST("/user/:id", api.UserAdd)
demo.PUT("/user", api.UserUpdate)
demo.DELETE("/user/:id", api.UserDelete)
}
进一步优化 userController.go
package api
import (
"fmt"
"github.com/gin-gonic/gin"
)
type UserController struct {}
// 为了使方法能够继承
func (con UserController) UserIndex(c *gin.Context) {
c.String(200, "api UserIndex")
}
func (con UserController) UserAdd(c *gin.Context) {
c.String(200, "api UserAdd")
}
func (con UserController) UserList(c *gin.Context) {
c.String(200, "api UserList")
}
func (con UserController) UserDelete(c *gin.Context) {
c.String(200, "api UserDelete")
}
func (con UserController) Update(c *gin.Context) {
c.String(200, "api Update")
}
/router/router.go
// 分组路由
demo := r.Group("/demo")
{
// 继承
demo.GET("/user", api.UserController{}.Index)
demo.GET("/user/:id", api.UserController{}.List)
demo.POST("/user/:id", api.UserController{}.Add)
demo.PUT("/user", api.UserController{}.Update)
demo.DELETE("/user/:id", api.UserController{}.Delete)
}
2.2 控制器的继承
继承后就可以调用控制器里面的公共方法。
新建controller\api\baseController.go
package api
import "github.com/gin-gonic/gin"
type BaseController struct {
}
func (con BaseController) success(c *gin.Context) {
c.String(200, "success")
}
func (con BaseController) error(c *gin.Context) {
c.String(200, "failed")
}
继续修改userController.go
package api
import (
"fmt"
"github.com/gin-gonic/gin"
)
type UserController struct {
// 继承 BaseController
BaseController
}
// 为了使方法能够继承
func (con UserController) UserIndex(c *gin.Context) {
con.success(c)
}
func (con UserController) UserAdd(c *gin.Context) {
c.String(200, "api UserAdd")
}
func (con UserController) UserList(c *gin.Context) {
c.String(200, "api UserList")
}
func (con UserController) UserDelete(c *gin.Context) {
c.String(200, "api UserDelete")
}
func (con UserController) Update(c *gin.Context) {
c.String(200, "api Update")
}
3.gin中间件
3.1 路由中间件
// 中间件函数
func InitMiddleWare(c *gin.Context) {
fmt.Println("init middle ware ")
}
...
func ApiRouter(r *gin.Engine) {
apiRouter := r.Group("/api")
{
// 中间件要放在最后一个回调函数的前面
apiRouter.GET("/", InitMiddleWare, api.UserController{}.Index)
// 一个路由配置多个中间件
apiRouter.GET("/", InitMiddleWareOne, InitMiddleWareTwo, api.UserController{}.Index)
}
}
3.2 全局中间件,路由分组中配置中间件
全局
// 中间件函数
func InitMiddleWare(c *gin.Context) {
fmt.Println("init middle ware ")
}
func ApiRouter(r *gin.Engine) {
apiRouter := r.Group("/api")
apiRouter.Use(InitMiddleWare)
// 多个中间件 apiRouter.Use(InitMiddleWareOne, InitMiddleWareTwo)
{
// 中间件要放在最后一个回调函数的前面
apiRouter.GET("/", InitMiddleWare, api.UserController{}.Index)
}
}
3.3 中间件和对应控制器之间的数据共享
router.go
// 中间件函数
func InitMiddleWare(c *gin.Context) {
c.Set("username", "张三")
}
userController.go
func (con UserController) Index(c *gin.Context) {
username, _ := c.Get("username")
fmt.Println(username)
c.JSON(200, gin.H{
"username" : username,
})
}