中间件记录请求记录后,无法绑定json数据

关于采用日志后的问题

  • 问题描述
      在开启日志中间件,记录请求数据后,在后续的流程中,无法使用ShouldBind等方法绑定数据,报EOF错误。
  • 解决方案
      经搜索资料,EOF是由于请求的body数据只允许读取一次,故可以修改为
    reqeustBody, _ := c.GetRawData()
    logFields = append(logFields, zap.String("Request Body", string(reqeustBody)))
    // 响应的内容
    logFields = append(logFields, zap.String("Response Body", w.body.String()))
    //新增的
    ctx.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data))
    相对应的参考文章
讨论数量: 1
Summer

原本的文章中有错误,已修复:

.
.
.
// 获取请求数据
var requestBody []byte
if c.Request.Body != nil {
    // c.Request.Body 是一个 buffer 对象,只能读取一次
    requestBody, _ = ioutil.ReadAll(c.Request.Body)
    // 读取后,重新赋值 c.Request.Body ,以供后续的其他操作
    c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(requestBody))
}

// 设置开始时间
start := time.Now()
c.Next()

// 开始记录日志的逻辑
cost := time.Since(start)
responStatus := c.Writer.Status()
.
.
.

c.GetRawData() 里用的也是使用 ioutil.ReadAll() 来读取 Buffer 数据:

func (c *Context) GetRawData() ([]byte, error) {
    return ioutil.ReadAll(c.Request.Body)
}
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!