gin中模型的绑定和验证

要将请求体绑定到结构体中,使用模型绑定。 Gin目前支持JSON、XML、YAML和标准表单值的绑定(foo=bar&boo=baz)。

Gin使用 go-playground/validator/v10 进行验证。 查看标签用法的全部文档.

使用时,需要在要绑定的所有字段上,设置相应的tag。 例如,使用 JSON 绑定时,设置字段标签为 json:"fieldname"

Gin提供了两类绑定方法:

  • Type - Must bind
    • Methods - BindBindJSONBindXMLBindQueryBindYAML
    • Behavior - 这些方法属于 MustBindWith 的具体调用。 如果发生绑定错误,则请求终止,并触发 c.AbortWithError(400, err).SetType(ErrorTypeBind)。响应状态码被设置为 400 并且 Content-Type 被设置为 text/plain; charset=utf-8。 如果您在此之后尝试设置响应状态码,Gin会输出日志 [GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422。 如果您希望更好地控制绑定,考虑使用 ShouldBind 等效方法。
  • Type - Should bind
    • Methods - ShouldBindShouldBindJSONShouldBindXMLShouldBindQueryShouldBindYAML
    • Behavior - 这些方法属于 ShouldBindWith 的具体调用。 如果发生绑定错误,Gin 会返回错误并由开发者处理错误和请求。

使用 Bind 方法时,Gin 会尝试根据 Content-Type 推断如何绑定。 如果你明确知道要绑定什么,可以使用 MustBindWith 或 ShouldBindWith

你也可以指定必须绑定的字段。 如果一个字段的 tag 加上了 binding:"required",但绑定时是空值, Gin 会报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main
 
import (
    "github.com/gin-gonic/gin"
    "net/http"
)
 
type Login struct {
    // binding: "-"      // - 表示可以不传递该参数
    User string `json:"user" form:"user" xml:"user" binding:"required"`
    Password string `json:"password" form:"password" xml:"password" binding:"required"`
}
 
func main() {
    // 模型的绑定和验证
 
    // 1. JSON的绑定和验证
    //r := gin.Default()
    //r.POST("/", func(context *gin.Context) {
    //  var login Login
    //  if err := context.ShouldBindJSON(&login); err != nil {
    //      context.String(http.StatusBadRequest, err.Error())
    //      return
    //  }
    //  if login.User != "li" || login.Password != "123456" {
    //      context.JSON(http.StatusUnauthorized, gin.H{"err": "unauthorized"})
    //      return
    //  }
    //  context.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
    //})
    //r.Run()
 
    // 2. 表单的绑定和验证
    //r := gin.Default()
    //r.POST("/", func(context *gin.Context) {
    //  var login Login
    //  // 根据Content-Type header 推断用哪个绑定器
    //  if err := context.ShouldBind(&login); err != nil {
    //      context.String(http.StatusBadRequest, err.Error())
    //      return
    //  }
    //  if login.User != "li" || login.Password != "123456" {
    //      context.JSON(http.StatusUnauthorized, gin.H{"err": "unauthorized"})
    //      return
    //  }
    //  context.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
    //})
    //r.Run()
 
    // 3. xml的绑定和验证
    /* xml格式:
        <?xml version="1.0" encoding="UTF-8"?>
        <root>
            <user>li</user>
            <password>123456</password>
        </root>
    */
    r := gin.Default()
    r.POST("/", func(context *gin.Context) {
        var login Login
        if err := context.ShouldBindXML(&login); err != nil {
            context.String(http.StatusBadRequest, err.Error())
            return
        }
        if login.User != "li" || login.Password != "123456" {
            context.JSON(http.StatusUnauthorized, gin.H{"err": "unauthorized"})
            return
        }
        context.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
    })
    r.Run()
 
}

  

validator 参考链接:

1. github:           https://github.com/go-playground/validator

2. document:     https://pkg.go.dev/github.com/go-playground/validator/v10#section-documentation

posted @   专职  阅读(272)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示