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

 

posted @ 2025-02-15 11:09  刘宏缔的架构森林  阅读(90)  评论(0)    收藏  举报