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://blog.apecloud.ltd/article/detail.html?id=gin-shoud-bind
来源:猿码云个人技术站
文章版权归作者所有,未经允许请勿转载。

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