G

[Golang]Gin框架 10.路由分组和中间件

RoLingG 2023-10-14

路由分组

将一系列的路由放到一个组下进行统一管理

例如,以下的路由前面统一加上名为api的前缀

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

type User_Info struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

type Article_Info struct {
    Name   string `json:"name"`
    Public string `json:"public"`
    Author string `json:"author"`
}

type Rsponse struct {
    Code int    `json:"code"`
    Data any    `json:"data"`
    Msg  string `json:"msg"`
}

func UserListView(c *gin.Context) {
    var userList []User_Info = []User_Info{
        {"RoLingG", 20},
        {"Clouwer", 23},
        {"test", 25},
    }
    //c.JSON(200, gin.H{"msg": "用户消息传递成功"})
    c.JSON(200, Rsponse{
        Code: http.StatusOK,
        Data: userList,
        Msg:  "用户列表请求成功",
    })
}

func ArticleListView(c *gin.Context) {
    var articleList []Article_Info = []Article_Info{
        {"RoLingG", "QH", "RoLingG"},
        {"Clouwer", "QH", "Clouwer"},
        {"test", "QH", "test"},
    }
    //c.JSON(200, gin.H{"msg": "用户消息传递成功"})
    c.JSON(200, Rsponse{
        Code: http.StatusOK,
        Data: articleList,
        Msg:  "文章列表请求成功",
    })
}

func ArticleRouterInit(router *gin.RouterGroup) {
    articleManager := router.Group("articleManager")
    articleManager.GET("/articles", ArticleListView)
}

func main() {
    router := gin.Default()

    //api和router一样都是被返回了一个结构体啥的,用了Group,路径就变成了/api/user
    //老版本能用{}括起来,新版本不能了
    //如果有一个Group当大的路径,那么它下面能分支出很多小的路径
    api := router.Group("api")
    //api.GET("/users", UserListView)

    userManager := api.Group("userManager")
    userManager.GET("/users", UserListView)

    //articleManager := api.Group("articleManager")
    //articleManager.GET("/articles", ArticleListView)
    //另一种写法,方法化
    ArticleRouterInit(api)

    router.Run(":80")
}

中间件

权限验证什么的。

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

type User_Info struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

type Res struct {
    Code int    `json:"code"`
    Data any    `json:"data"`
    Msg  string `json:"msg"`
}

func _UserListView(c *gin.Context) {
    var userList []User_Info = []User_Info{
        {"RoLingG", 20},
        {"Clouwer", 23},
        {"test", 25},
    }
    //c.JSON(200, gin.H{"msg": "用户消息传递成功"})
    c.JSON(200, Res{
        Code: http.StatusOK,
        Data: userList,
        Msg:  "用户列表请求成功",
    })
}

func Middleware(c *gin.Context) {
    token := c.GetHeader("token")
    //jwt校验,这里没学先固定1234
    if token == "1234" {
        c.Next()
        return
    }
    c.JSON(200, Res{
        Code: http.StatusOK,
        Data: nil,
        Msg:  "权限验证失败",
    })
    c.Abort()
}

//// middleware()写法的
//func Middleware(msg string) gin.HandlerFunc {
//    return func(c *gin.Context) {
//        token := c.GetHeader("token")
//        //jwt校验,这里没学先固定1234
//        if token == "1234" {
//            c.Next()
//            return
//        }
//        c.JSON(200, Res{
//            Code: http.StatusOK,
//            Data: nil,
//            Msg:  msg,
//        })
//        c.Abort()
//    }
//}

func main() {
    //①
    //Default里的Logger就是日志,将一系列的东西打印在控制台里,自带两个中间件(New和Use,Use里有Logger和Recovery)
    //通过手动panic报错可以看一系列信息
    router := gin.Default()

    //②
    //不含任何中间件的
    //而这个手动报错则看不到任何信息,因为不含任何中间件所以什么都没,直接服务不可用(报错不是人看的)
    //且就算不报错,控制台也没有任何输出信息
    //如果要像Default一样有那些日志、中间件的话,则要自己手动加,但这样可以自己做更多Gin的日志提示,相当于说自定义功能了。
    //router := gin.New()
    //router.Use(gin.Logger(), gin.Recovery())
    //↑这两加一起同等于gin.Default

    //全局路径设置
    api := router.Group("api")
    //不需要权限校验
    //登录、注册不需要登录验证,所以要分组
    api.GET("/login", func(c *gin.Context) {
        //故意手动报错
        //panic("手动报错")
        c.JSON(200, gin.H{"data": "1234"})
    })

    //闭包写法就这样写
    //api.GET("/login", Middleware("登录验证失败"), func(c *gin.Context) {
    //    c.JSON(200, gin.H{"data": "token:1234"})
    //})

    //需要权限校验、加入中间件
    //中间件如果是middleware(),则要满足Use(middleware())的返回值类型,看具体情况
    //↓但有一说一没必要这样写,还稍微麻烦看不懂,它会直接走函数里的return,外面的都不走。但它能形成闭包,这算一点好处,如果校验失败,要自订一个返回值,就可以传参数给它。
    //userManager := api.Group("userManager").Use(Middleware("用户校验失败"))
    userManager := api.Group("userManager").Use(Middleware)

    userManager.GET("/users", _UserListView)

    router.Run(":80")
}

———————————————————————————————————————————

后续会更改一下讲解,这只是草稿

PREV
[Golang]Gin框架 9.中间件
NEXT
[Golang]Gin框架 11.日志

评论(0)

发布评论