go语言 gin框架学习系列(三):路由、控制器、中间件

231 阅读2分钟

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,
	})
}

参考链接:blog.csdn.net/book_longke…