gin简单处理api响应数据中间件

golang不像python一样。 不可以动态对c.Context做方法的扩展。看到gin.Context有一个Set, 还有一个Get可以用这来交互接口响应数据给中间件哈。

调用代码

/*
    Author        : tuxpy
    Email         : q8886888@qq.com.com
    Create time   : 2017-03-20 10:42:14
    Filename      : t.go
    Description   :
*/

package main

import (
    "gin_middlewares"

    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.New()
    router.Use(gin.Logger(), gin.Recovery(), gin_middlewares.Default(map[string]interface{}{
        "code": 200,
        "msg":  "",
    }))
    router.GET("/", func(c *gin.Context) {
        c.Set("$.data.sub.sun.aaa.bbb.ccc.name", "abc")
    })
    router.Run(":1996")
}

中间件代码

/*
	Author        : tuxpy
	Email         : q8886888@qq.com.com
	Create time   : 2017-03-22 21:14:12
	Filename      : default.go
	Description   :
*/
package gin_middlewares

import (
	"strings"

	"github.com/gin-gonic/gin"
)

func Default(resp_template map[string]interface{}) gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Next()
		if c.Writer.Written() {
			return
		}

		resp := make(map[string]interface{}, len(resp_template))
		for k, v := range resp_template {
			resp[k] = v
		}

		params := c.Keys
		for name, value := range params {
			if !strings.HasPrefix(name, "$.") {
				continue
			}
			data := resp
			name = strings.TrimLeft(name, "$.")
			name_parts := strings.Split(name, ".")
			for index, name_part := range strings.Split(name, ".") {
				if index == len(name_parts)-1 {
					data[name_part] = value

				} else if _, ok := data[name_part]; !ok {
					data[name_part] = make(map[string]interface{})
					data = data[name_part].(map[string]interface{})
				}
			}
		}

		c.JSON(c.Writer.Status(), resp)

	}
}

转载于:https://my.oschina.net/tuxpy/blog/865027

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值