1. 一般通过调用 c.Request.Body 方法绑定数据,但不能多次调用这个方法。

package main

import (
"fmt"
"github.com/gin-gonic/gin"
) type FormA struct {
Foo string `form:"foo" json:"foo" binding:"required"`
}
type FormB struct {
Bar string `json:"bar" binding:"required"`
}
func someHandler(c *gin.Context) {
// 一般通过c.request.body绑定数据,但是不能多次调用这个方法
objA := FormA{}
objB := FormB{}
// c.ShouldBind 使用了 c.Request.Body 不可重用
// 注意:ShouldBind方法,如果是GET请求,前台必须使用form-data传参
if err := c.ShouldBind(&objA); err == nil {
fmt.Println(objA.Foo)
c.String(200, "the body should be FormA")
// 因为现在 c.Request.Body 是EOF,所以这里会报错
} else if err := c.ShouldBind(&objB); err == nil {
c.String(200, "the body should be FormB")
} else {
fmt.Println(err)
fmt.Println("未执行")
}
} func main() {
router := gin.Default()
router.POST("/ping", someHandler)
router.Run()
}

  

2. 要想多次绑定,可以使用 c.ShouldBindBodyWith.

package main

import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)

type FormA struct {
Foo string `form:"foo" json:"foo" binding:"required"`
}
type FormB struct {
Bar string `json:"bar" binding:"required"`
}
func someHandler(c *gin.Context) {
objA := FormA{}
objB := FormB{}
// 读取 c.Request.Body 并将结果存入上下文。
if err := c.ShouldBindBodyWith(&objA, binding.JSON); err == nil {
fmt.Println(objA.Foo)
c.String(200, "the body should be FormA")
// 这时, 复用存储在上下文中的 body。
} else if err := c.ShouldBindBodyWith(&objB, binding.JSON); err == nil {
c.String(200, "the body should be FormB")
} else {
fmt.Println(err)
fmt.Println("未执行")
}
}

func main() {
router := gin.Default()
router.POST("/ping", someHandler)
router.Run()
}

  

  • c.ShouldBindBodyWith 会在绑定之前将 body 存储到上下文中。 这会对性能造成轻微影响,如果调用一次就能完成绑定的话,那就不要用这个方法。
  • 只有某些格式需要此功能,如 JSONXMLMsgPackProtoBuf。 对于其他格式, 如 QueryFormFormPostFormMultipart 可以多次调用 c.ShouldBind() 而不会造成任任何性能损失。

最新文章

  1. iOS单个应用程序的最大可用内存是多少?
  2. jQuery-表格以及表单
  3. 【iCore3 双核心板_FPGA】例程十:锁相环实验——锁相环使用
  4. [Android]ViewPager如何只初始化一个页面
  5. Scala中的Apply
  6. Add SSH Key to GitLab on Windows
  7. Shell脚本基础II
  8. 详解TCP和UDP数据段的首部格式
  9. Flex通信-Java服务端通信实例
  10. spring整合quartz实现定时任务
  11. MySQL 优化Limit分页
  12. iOS 7 改变Status Bar 颜色
  13. UVALive 2403 77377解题报告(深搜)
  14. shuffle和sort分析
  15. Java 枚举类型简介
  16. Android-蓝牙自动配对与隐藏对话框
  17. C++ 断言
  18. NetSec2019 20165327 EXP5 MSF基础应用
  19. web前端优化
  20. Android 支付密码输入框,自定义EditText实现密码输入框功能;

热门文章

  1. IDEA设置默认(指定)的注释作者信息
  2. windows平台使用 pthreads库
  3. 【LeetCode】911. Online Election 解题报告(Python)
  4. 【LeetCode】371. Sum of Two Integers 解题报告(Python)
  5. Sufficient Statistic (充分统计量)
  6. Geometric GAN
  7. 网易云 微专业C++系统工程师
  8. MySQL高级查询与编程笔记 • 【第2章 数据定义和操作】
  9. Java得到当前时间并格式化输出
  10. 编写Java程序,使用面向接口编程模拟不同动物的吼叫声