package mw import ( "applet/app/e" "applet/app/md" "applet/app/utils" "applet/app/utils/cache" "bytes" "fmt" "github.com/gin-gonic/gin" "io/ioutil" ) //自己实现一个type gin.ResponseWriter interface type responseWriter struct { gin.ResponseWriter b *bytes.Buffer } //重写Write([]byte) (int, error) func (w responseWriter) Write(b []byte) (int, error) { //向一个bytes.buffer中再写一份数据 w.b.Write(b) //完成gin.Context.Writer.Write()原有功能 return w.ResponseWriter.Write(b) } // RequestCache is cache middleware func RequestCache(c *gin.Context) { tempMasterId, _ := c.Get("master_id") masterId := tempMasterId.(string) uri := c.Request.RequestURI md5Params := dealBodyParams(c) cacheKey := fmt.Sprintf(md.ZhimengDataRequestCacheKey, masterId, uri, md5Params) //自己实现一个type gin.ResponseWriter writer := responseWriter{ c.Writer, bytes.NewBuffer([]byte{}), } isUse, _ := cache.GetInt(md.ZhimengIsUseCacheKey) var res = map[string]interface{}{} cache.GetJson(cacheKey, &res) if res["data"] != nil && isUse == 1 { e.OutSuc(c, res["data"], nil) return } c.Writer = writer c.Next() } func dealBodyParams(c *gin.Context) (md5Params string) { body, err := c.GetRawData() if err != nil { panic(err) } fmt.Println(">>>>>>>>>>string<<<<<<<<<<<", string(body)) md5Params = utils.Md5(string(body)) //TODO::把读过的字节流重新放到body c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body)) return }