Gin框架参数多次绑定

一、 使用ShouldBindBodyWith解决


var l loginReq
if err := c.ShouldBindBodyWith(&l, binding.JSON); err != nil {
    fmt.Println("err: ", err)
    c.Abort()
}
var l2 loginReq
if err := c.ShouldBindBodyWith(&l2, binding.JSON); err != nil {
    fmt.Println("err: ", err)
    c.Abort()
}

二、 转存Body


// 先把body取出来
		data, err := c.GetRawData()
		if err != nil {
			fmt.Println("read body failed, error: ", err)
		}

		// bind之前把body写回去
		c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data))
		var l loginReq
		if err := c.ShouldBind(&l); err != nil {
			fmt.Println("err: ", err)
			c.Abort()
		}

		// bind之后把body写回去
		c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data))

三 不用影响后续使用的方法


    var (
        p1 Person
        p2 Person
    )
    buf := &bytes.Buffer{}
    tea := io.TeeReader(c.Request.Body, buf)
    body, err := ioutil.ReadAll(tea)
    if err != nil {
        log.Panicf("read body err: %+v", err)
    }
    c.Request.Body = ioutil.NopCloser(buf)
    // read buf ...
    if err := binding.JSON.BindBody(body, &p1); err != nil {
        log.Panic("p1", err)
    }
    log.Println("p1", p1)
    // use ShouldBind again ..
    if err := c.ShouldBind(&p2); err != nil {
        log.Panic("p2", err)
    }
    log.Println("p2", p2)

版权声明:
作者:超级管理员
链接: https://apecloud.ltd/article/detail.html?id=gin-shoud-bind
来源:猿码云个人技术站
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
/static/admin/img/weixin.jpg/static/admin/img/zfb.jpg
<<上一篇>
Go 语言类型转换
下一篇>>