gin简单处理api响应数据中间件 - Go语言中文社区

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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_33923148/article/details/91709379
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-06 10:46:46
  • 阅读 ( 1574 )
  • 分类:Go Web框架

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢