golang Gin定制自定义Context

更新时间:2023-11-20 12:00:34 阅读:20 所属栏目: 日志

每次使用gin时返回json都需要handler里面用context.JSON()返回,异常的麻烦。

这里封装一下工具方法直接调用ctx.Ok(data)这样的方式返回

定义一个Context

type Context struct {
	*gin.Context
}

添加方法

// UnAuthorization 未授权
func (c Context) UnAuthorization() {
	d := Body{
		Code: code.RUnAuthorization,
		Data: nil,
		Msg:  "未授权",
	}
	c.JSON(http.StatusOK, d)
}

// Ok 成功
func (c Context) Ok(data any, msg any) {
	d := Body{
		Code: code.ROk,
		Data: data,
		Msg:  "操作成功",
	}
	if mg, ok := msg.(string); ok {
		d.Msg = mg
	}
	c.JSON(http.StatusOK, d)
}
// Fail 操作失败
func (c Context) Fail(msg any) {
	d := Body{
		Code: code.RFail,
		Data: nil,
		Msg:  "操作失败",
	}
	if mg, ok := msg.(string); ok {
		d.Msg = mg
	}
	c.JSON(http.StatusOK, d)
}

// ParamFail 参数错误 
func (c Context) ParamFail(msg any) {
	d := Body{
		Code: code.RParamError,
		Data: nil,
		Msg:  "参数错误",
	}
	if mg, ok := msg.(string); ok {
		d.Msg = mg
	}
	c.JSON(http.StatusOK, d)
}

func (c Context) Error(msg any) {
	d := Body{
		Code: code.RError,
		Data: nil,
		Msg:  "系统错误",
	}
	if mg, ok := msg.(string); ok {
		d.Msg = mg
	}
	c.JSON(http.StatusOK, d)
}

// ExtractPager 提取分页
func (c Context) ExtractPager() (page int, size int) {
	page, err := strconv.Atoi(c.Query("page"))
	if err != nil {
		page = 1
	}
	size, err = strconv.Atoi(c.Query("size"))
	if err != nil {
		size = 10
	}
	return page, size
}

定义handler方法,并注入到gin.Engin中

type HandlerFunc func(*Context)

func Handler(fn HandlerFunc) gin.HandlerFunc {
	return func(c *gin.Context) {
		ctx := new(Context)
		ctx.Context = c
		fn(ctx)
	}
}

路由中使用


func page() HandlerFunc {
	return func(ctx *Context) {
		page, size := ctx.ExtractPager()
		ctx.Ok(gin.H{
			"size": size,
			"page": page,
		}, nil)
	}
}

r := gin.Default()
r.GET("/",Handler(page()))

$$end, have fun.