gin框架使用注意事项

更新时间:2023-05-17 12:24:00 阅读: 评论:0

gin框架使⽤注意事项
2019-03-21 12:39 by 轩脉刃, ... 阅读, ... 评论, ,
gin框架使⽤注意事项
本⽂就说下这段时间我在使⽤gin框架过程中遇到的问题和要注意的事情。
错误处理请求返回要使⽤c.Abort,不要只是return
当在controller中进⾏错误处理的时候,发现⼀个错误,往往要⽴即返回,这个时候要记得使⽤gin.Context.Abort 或者其相关的函数。
类似于:
当代小学生if err != nil {
c.AbortWithStatus(500)
return
}
这个Abort函数本质是提前结束后续的handler链条,(通过将handler的下标索引直接变化为 math.MaxInt8 / 2 )但是前⾯已经执⾏过的handler链条(包括middleware等)还会继续返回。
gin的Abort系列的⼏个函数为:
func (c *Context) Abort()
func (c *Context) AbortWithStatus(code int)
func (c *Context) AbortWithStatusJSON(code int, jsonObj interface{})
func (c *Context) AbortWithError(code int, err error)
gin的错误处理
gin本⾝默认加载了Recovery()的中间件,所以在不知道如何处理error的时候,可以直接panic出去
如何获取respon的body
需求来源于我要做个gin的中间件,请求进来的时候记录⼀下请求参数,请求出去的时候记录⼀下请求返回值。在记录请求返回值的时候,我就需要得到请求的返回内容。但是context⾥⾯只有⼀个结构:
Writer    gin.ResponWriter
所以这⾥基本思路就是创建⼀个Writer,它继承gin.ResponWriter。同时,它⼜有⼀个byte.buffer来copy⼀份数据。
// bodyLogWriter是为了记录返回数据到log中进⾏了双写
type bodyLogWriter struct {
gin.ResponWriter
body *bytes.Buffer
}
func (w bodyLogWriter) Write(b []byte) (int, error) {
w.body.Write(b)
return w.ResponWriter.Write(b)
}
所以,在middleware中就应该这么写
sTime := time.Now()
diyt恤blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponWriter: c.Writer}
c.Writer = blw
怎么换电脑壁纸c.Next()
// 请求结束的时候记录
duration := fmt.Sprintf("%fms", float64(time.Now().Sub(sTime).Nanoconds()) / 1000000.0)
handler.Tracef(c.Request.Context(), logger.DLTagRequestOut,
"proc_time=%s||respon=%s",
duration,
blw.body.String())
主要就是在Next之前吧context.Writer⽤我们定义的Writer给替换掉,让它输出数据的时候写两份。
如何获取所有的请求参数
这个其实和gin框架没有啥关系,我刚开始使⽤的时候以为使⽤request.ParForm,然后在request.Form中就能得到了。结果发现当我的Content-type为multipart/form-data的时候,竟然解析不到数据。
追到ParForm⾥⾯发现,⾥⾯有这么⼀个部分代码
ca ct == "multipart/form-data":
六月雪盆景
// handled by ParMultipartForm (which is calling us, or should be)
// TODO(bradfitz): there are too many possible
新疆的歌>萝卜焖牛腩// orders to call too many functions here.
// Clean this up and write more tests.
// contains the start of this,疏通下水
// in TestParMultipartFormOrder and others.
}
我的golang版本是1.11.4。当content-type为multipart/form-data的时候是空的调⽤的。
当然注释也写很清楚了,建议使⽤ParMultipartForm
所以获取http参数的函数我就写成这个样⼦:
// 这个函数只返回json化之后的数据,且不处理错误,错误就返回空字符串
func getArgs(c *gin.Context) []byte {
if c.ContentType() == "multipart/form-data" {
c.Request.ParMultipartForm(defaultMemory)
} el {
c.Request.ParForm()安全教育片
}
args, _ := json.Marshal(c.Request.Form)
return args
}

本文发布于:2023-05-17 12:24:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/667601.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:请求   时候   记录   返回   框架   函数   参数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图