gin: 中间件给controller传递参数
一,中间件代码
这里我们演示一个例子:判断用户是否登录后,传递参数给controller
func AuthCheck() gin.HandlerFunc {
return func(c *gin.Context) {
//从c得到参数后进行判断
isLogin:=1
userId:=100
if isLogin == 0 {
fmt.Println("before abort")
//放弃后续请求的执行
c.Abort()
c.JSON(http.StatusOK, gin.H{
"msg": "auth failed",
"code": 1,
})
fmt.Println("after abort")
return
} else {
//传递参数给后续中间件和controller
c.Set("isLogin",isLogin)
c.Set("userId",userId)
c.Next()
}
return
}
}
总结:
c.Next(): 进入下一个中间件或路由处理函数。
所有中间件执行完后,按注册顺序的逆序执行“请求后逻辑”。
中断请求
在中间件中,可以通过以下方法中断请求:
c.Abort():停止执行后续中间件和路由处理函数。
c.AbortWithStatus(code):中断请求并返回指定的HTTP状态码。
c.AbortWithStatusJSON(code, jsonObj):中断请求并返回JSON格式的响应。
二,controller代码
接收参数:
//得到详情
func (ic *ImageController) Detail(c *gin.Context) {
fmt.Println("controller:开始执行detail方法")
//得到从middleware传递的参数
isLogin,ok := c.Get("isLogin")
if !ok {
fmt.Println("未登录")
} else {
fmt.Println("是否登录:",isLogin)
}
userIdOrig,ok := c.Get("userId")
if !ok {
fmt.Println("未登录")
} else {
fmt.Println("用户id:",userIdOrig)
//转为整数类型
if userId, ok := userIdOrig.(int); ok {
fmt.Println("转换成功:", userId)
} else {
fmt.Println("转换失败,userIdOrig不是int类型")
}
}
articleService := service.NewImageService(c)
article,err:=articleService.GetOneImageById(21)
if errors.Is(err, gorm.ErrRecordNotFound) {
c.JSON(http.StatusOK, gin.H{
"message": "记录不存在",
})
return
} else if err!=nil {
fmt.Println("==================controller中err:",err)
c.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
})
return
} else {
c.JSON(http.StatusOK, gin.H{
"message": article.Content,
})
return
}
}
三,router中启用middleware
//image
image := controller.NewImageController()
//启用组中间件
imageGroup := router.Group("/image").Use(middleware.AccessLog())
{
//启用单路由中间件
imageGroup.GET("/detail", middleware.AuthCheck(), image.Detail)
imageGroup.GET("/list", image.List)
imageGroup.POST("/add", image.Add)
}
四,测试效果
15:21:01 app | controller:开始执行detail方法
15:21:01 app | 是否登录: 1
15:21:01 app | 用户id: 100
15:21:01 app | 转换成功: 100
浙公网安备 33010602011771号