路由分组
将一系列的路由放到一个组下进行统一管理
例如,以下的路由前面统一加上名为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")
}
———————————————————————————————————————————
后续会更改一下讲解,这只是草稿
评论(0)