gin将请求体绑定到不同的结构体中

绑定请求体的常规方法使用c.Request.Body,并且不能多次调用

type formA struct {Foo string `json:"foo" xml:"foo" binding:"required"`
}type formB struct {Bar string `json:"bar" xml:"bar" binding:"required"`
}func SomeHandler(c *gin.Context) {objA := formA{}objB := formB{}// This c.ShouldBind consumes c.Request.Body and it cannot be reused.if errA := c.ShouldBind(&objA); errA == nil {c.String(http.StatusOK, `the body should be formA`)// Always an error is occurred by this because c.Request.Body is EOF now.} else if errB := c.ShouldBind(&objB); errB == nil {c.String(http.StatusOK, `the body should be formB`)} else {...}
}

同样,你能使用c.ShouldBindBodyWith

func SomeHandler(c *gin.Context) {objA := formA{}objB := formB{}// This reads c.Request.Body and stores the result into the context.if errA := c.ShouldBindBodyWith(&objA, binding.JSON); errA == nil {c.String(http.StatusOK, `the body should be formA`)// At this time, it reuses body stored in the context.} else if errB := c.ShouldBindBodyWith(&objB, binding.JSON); errB == nil {c.String(http.StatusOK, `the body should be formB JSON`)// And it can accepts other formats} else if errB2 := c.ShouldBindBodyWith(&objB, binding.XML); errB2 == nil {c.String(http.StatusOK, `the body should be formB XML`)} else {...}
}
  • c.ShouldBindBodyWith 在绑定之前将body存储到上下文中,这对性能有轻微影响,因此如果你要立即调用,则不应使用此方法
  • 此功能仅适用于这些格式 -- JSONXMLMsgPackProtoBuf。对于其他格式,QueryFormFormPostFormMultipart, 可以被c.ShouldBind()多次调用而不影响性能

gin将请求体绑定到不同的结构体中相关推荐

  1. Gin 框架学习笔记(01)— 自定义结构体绑定表单、绑定URI、自定义log、自定义中间件、路由组、解析查询字符串、上传文件、使用HTTP方法

    要实现一个 API 服务器,首先要考虑两个方面:API 风格和媒体类型.Go 语言中常用的 API 风格是 RPC 和 REST,常用的媒体类型是 JSON.XML 和 Protobuf.在 Go A ...

  2. c语言结构体反射解析,C语言结构体解析

    我们知道定义一个数组就等于定义了多个相同类型的变量,它们的类型是一样的.有时有这样的需求,如果我想保存一些信息,但每个信息类型不一定相同,这时该怎么办?我们就可以自己定义一类型,而这个类型,就是结构体 ...

  3. malloc 结构体_算法与数据结构——结构体变量

    首先,要学习数据结构,一般要先了解结构体变量的使用,那么该如何定义结构体变量呢?随我一起回忆一下吧.(不一样的音乐,不一样的体验)(1)直接定义结构体变量.struct {int a;        ...

  4. c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt

    <<结构体与共同体>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<结构体与共同体>PPT课件.ppt(44页珍藏版)>请在装配图网上搜索. 1 ...

  5. 通过结构体某个成员的地址计算结构体首地址 (转)

    最近在CU论坛上有很多人在问这样一个问题:给出一个结构体成员的地址计算该结构体的起始地址.其实这个题我之前也没有接触过,据说内核代码中有这样用的,但还没有看到.不过觉得这个题的解决方法还是有一定技巧的 ...

  6. 【精华文】C语言结构体特殊情况分析:结构体指针 / 基本数据类型指针,指向其他结构体

    参考链接:Structure pointer pointing to different structure instance 注:可以查看此篇的问题和唯一的回复,那是相对正确的,不要看comment ...

  7. Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承

    结构体: 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体可以很好的管理一批有联系的数据,使用结构体可以提高程序的易读性,类似于Java的类一样 不能在结构体直接赋值 字段名必须唯一 ...

  8. C++工作笔记-结构体与类的进一步探究(在C++中的结构体,非C语言结构体)

    今天把Qt Creator中的项目放到VS上,使用MSVC编译器发现跑不动链接错误,报的是如下的这个错误: 我在Qt上用MinGW明明不会报错,而他却说链接不到,日了个狗. 后面根据报错提示,我把如下 ...

  9. c语言 给结构体赋初值,c/c++ 结构体赋初值的小技巧

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 转:https://blog.csdn.net/datase/article/details/78988320 1.CC++结构体的初始化 今天看到项目中 ...

最新文章

  1. spring的自生一个bug
  2. 5 java中的集合类_java基础(5)-集合类1
  3. Linux下qt桌面程序闪退,qt无法正常使用
  4. Python基础知识(第八天)
  5. 诺基亚继续打情怀牌:怀旧小屏手机入网!
  6. 如何在Ruby on Rails迁移中重命名数据库列?
  7. C语言简明教程--指针5
  8. 邮箱smtp服务-QQ邮箱163邮箱(保姆级图文)【杂记】
  9. MySQL 有哪些锁?
  10. mysql 如何去掉毫秒_mysql 如何去掉毫秒值
  11. html文档在word打开是乱码怎么解决,word打开是乱码的解决方法
  12. 怎么把pdf文件转换成word格式文档
  13. 危险废物自动化立体仓库设计方案
  14. 【英语阅读】纽约时报 | 台湾美食为什么那么“Q”?
  15. 手把手教你脑电波采集及信号处理分析 - 知乎
  16. fceux源码解析_FCEUX金手指加强版 - 使用Lua脚本语言编写FC/NES金手指脚本
  17. 使用 hugegraph-studio 插入电影数据并查询
  18. LintCode 183.木材加工
  19. css 高度塌陷_css中父元素高度塌陷是什么意思,如何解决?(附代码)
  20. KISS原则和YAGNI原则

热门文章

  1. 【错误记录】Flutter 设备连接显示 Loading... ( 断网 | 删除 flutter/bin/cache/lockfile 文件 )
  2. 【网站搭建】搭建独立域名博客 -- 独立域名博客上线了 www.hanshuliang.com
  3. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...
  4. 2019.04.09 电商23 用户未登录操作数据库
  5. springboot2.X 在项目启动后执行一段自定义代码
  6. CSS笔记(十)position属性与定位
  7. Ubuntu 使用 heirloom-mail 调用外部邮箱 SMTP 服务器发送邮件
  8. 空指针错误 java.lang.NullPointerException 浅谈
  9. 2018-2019-1 20189218《Linux内核原理与分析》第五周作业
  10. ORACLE安装报错解决