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)
}
}