ShouldBind、ShouldBindJson、ShouldBindQuery的区别

|---------------------|-----------|---------------------|----------|
| 方法 | 数据来源 | Content-Type 要求 | 自动检测 |
| ShouldBind() | 自动检测 | 不限 | 是 |
| ShouldBindJSON() | 只读 JSON | application/json | 否 |
| ShouldBindQuery() | 只读 URL 参数 | 无 | 否 |

Content-Type 决定解析方式:

Content-Type 解析方式
application/json JSON 解析
multipart/form-data 表单解析
application/x-www-form-urlencoded 表单解析

常见的 Content-Type

Content-Type 含义 数据长什么样
application/json JSON 格式 {"name": "张三", "age": 18}
text/html HTML 网页 <html><body>...</body></html>
text/plain 纯文本 这是一段文字
multipart/form-data 表单+文件 表单字段
image/jpeg JPEG 图片 图片二进制数据

shouldbind:

特点:自动检测 Content-Type;支持多种数据格式;根据请求类型选择绑定方式

支持的content-type:

(1)application/json → JSON 绑定

(2)application/xml → XML 绑定

(3)multipart/form-data → 表单绑定(含文件)

(4)application/x-www-form-urlencoded → 表单绑定

Go 复制代码
func CreateUser(c *gin.Context) {
    var req UserRequest
    // 自动识别 Content-Type
    if err := c.ShouldBind(&req); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    // 处理业务
}

shouldbindjson--专为JSON

Go 复制代码
func (c *Context) ShouldBindJSON(obj interface{}) error

特点:只处理JSON格式;要求 Content-Type: application/json;性能稍好(省去类型判断)

示例:

Go 复制代码
func CreateUser(c *gin.Context) {
    var req UserRequest
    // 明确要求 JSON 格式
    if err := c.ShouldBindJSON(&req); err != nil {
        c.JSON(400, gin.H{"error": "请提供正确的JSON格式"})
        return
    }
    // 处理业务
}

shouldbindquery:

Go 复制代码
func (c *Context) ShouldBindQuery(obj interface{}) error

特点:只绑定URL查询参数(?key=value);忽略请求体;适用于GET请求

示例:

Go 复制代码
// GET /api/users?page=1&page_size=10&name=john
func GetUsers(c *gin.Context) {
    var query UserQuery
    // 只绑定查询参数
    if err := c.ShouldBindQuery(&query); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    fmt.Println(query.Page)     // 1
    fmt.Println(query.PageSize) // 10
    fmt.Println(query.Name)     // "john"
}

结构体标签详解

json--JSON字段映射--json:"user_name"

form--表单字段映射--form:"user_name"

uri--路径参数映射--uri:"id"

header--HTTP头部映射--header:"X-Token"

xml--XML字段映射--xml:"user_name"

yaml--YAML字段映射--yaml:"user_name"

相关推荐
元Y亨H3 分钟前
代码中如何打印优质的日志
后端
用户6802659051199 分钟前
全栈可观测性白皮书——实施、收益与投资回报率
javascript·后端·面试
天若有情67312 分钟前
IoC不止Spring!求同vs存异,两种反向IoC的核心逻辑
java·c++·后端·算法·spring·架构·ioc
神奇小汤圆16 分钟前
给 Spring Boot 接口加了幂等保护:Token 机制 + 结果缓存,一个注解搞定
后端
绝无仅有20 分钟前
mac笔记本中在PHP中调用Java JAR包的指南
后端·面试·架构
绝无仅有21 分钟前
PHP与Java项目在服务器上的对接准备与过程
后端·面试·架构
神奇小汤圆22 分钟前
理解 SQL JOIN: ON 与 WHERE 的区别
后端
四七伵25 分钟前
数据库必修课:MySQL金额字段用decimal还是bigint?
数据库·后端
彭于晏Yan35 分钟前
LangChain4j实战三:图像模型
java·spring boot·后端·langchain
SimonKing1 小时前
跨越数据孤岛!SpringBoot使用JDBC调用Calcite联邦查询实战
java·后端·程序员