gin中间request body绑定到不同的结构体中
2024-08-24 05:51:11
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 存储到上下文中。 这会对性能造成轻微影响,如果调用一次就能完成绑定的话,那就不要用这个方法。- 只有某些格式需要此功能,如
JSON
,XML
,MsgPack
,ProtoBuf
。 对于其他格式, 如Query
,Form
,FormPost
,FormMultipart
可以多次调用c.ShouldBind()
而不会造成任任何性能损失。
最新文章
- iOS单个应用程序的最大可用内存是多少?
- jQuery-表格以及表单
- 【iCore3 双核心板_FPGA】例程十:锁相环实验——锁相环使用
- [Android]ViewPager如何只初始化一个页面
- Scala中的Apply
- Add SSH Key to GitLab on Windows
- Shell脚本基础II
- 详解TCP和UDP数据段的首部格式
- Flex通信-Java服务端通信实例
- spring整合quartz实现定时任务
- MySQL 优化Limit分页
- iOS 7 改变Status Bar 颜色
- UVALive 2403 77377解题报告(深搜)
- shuffle和sort分析
- Java 枚举类型简介
- Android-蓝牙自动配对与隐藏对话框
- C++ 断言
- NetSec2019 20165327 EXP5 MSF基础应用
- web前端优化
- Android 支付密码输入框,自定义EditText实现密码输入框功能;
热门文章
- IDEA设置默认(指定)的注释作者信息
- windows平台使用 pthreads库
- 【LeetCode】911. Online Election 解题报告(Python)
- 【LeetCode】371. Sum of Two Integers 解题报告(Python)
- Sufficient Statistic (充分统计量)
- Geometric GAN
- 网易云 微专业C++系统工程师
- MySQL高级查询与编程笔记 • 【第2章 数据定义和操作】
- Java得到当前时间并格式化输出
- 编写Java程序,使用面向接口编程模拟不同动物的吼叫声