要将请求体绑定到结构体中,使用模型绑定。 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 会报错。

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

gin中模型的绑定和验证的更多相关文章

  1. gin中multipart/urlencoded绑定

    package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) ty ...

  2. asp.net core系列 45 Web应用 模型绑定和验证

    一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到action方法参数. 这些参数可能是简单类型的参数,如字符串.整数或浮点数,也可能是复杂类型的参数. ...

  3. gin中如何自定义验证器

    package main import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding&qu ...

  4. 理解Java中的前期绑定和后期绑定

    前期绑定,在程序执行前根据编译时类型绑定,调用开销较小,如C语言只有前期绑定这种方法调用. 后期绑定,是指在运行时根据对象的类型进行绑定,又叫动态绑定或运行时绑定.实现后期绑定,需要某种机制支持,以便 ...

  5. asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证

    原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...

  6. centos7中安装、配置、验证、卸载redis

    本文介绍在centos7中安装.配置.验证.卸载redis等操作,以及在使用redis中的一些注意事项. 一 安装redis 1 创建redis的安装目录 利用以下命令,切换到/usr/local路径 ...

  7. python 机器学习中模型评估和调参

    在做数据处理时,需要用到不同的手法,如特征标准化,主成分分析,等等会重复用到某些参数,sklearn中提供了管道,可以一次性的解决该问题 先展示先通常的做法 import pandas as pd f ...

  8. django中模型详解-字段类型与约束条件

    这片博文来详细说明django模型的使用,涉及到django模型的创建,字段介绍,以及django模型的crud操作,以及一对一等操作. 在使用模型之前,我们首先设置数据库选项,django的默认数据 ...

  9. Django中模型(二)

    Django中模型(二) 三.定义模型 1.模型.属性.表.字段间的关系: 一个模型类在数据库中对应一张表:在模型类中定义的属性,对应该模型对照表中的字段. 2.定义属性 A.概述 ·django根据 ...

随机推荐

  1. Elasticsearch 和 solr 的区别

    背景:它们都是基于Luence搜索服务器基础之上开发的一款优秀高性能的企业级搜索服务器.也都是基于分词技术构建的倒排索引的方式进行查询 开发语言:java 诞生时间: solr  :2004年 es ...

  2. Qt之QListView和QStandardItemModel用法

    note 个人理解, QListView 用于 显示数据,而数据的逻辑维护则由 QStandardItemModel 完成. QStandardItemModel 创建 if (nullptr == ...

  3. 【LeetCode】1134. Armstrong Number 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 直接计算 日期 题目地址:https://leetco ...

  4. 【LeetCode】133. Clone Graph 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...

  5. 【LeetCode】777. Swap Adjacent in LR String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 智商题 相似题目 参考资料 日期 题目地址:http ...

  6. 【剑指Offer】链表中倒数第k个节点 解题报告(Python)

    [剑指Offer]链表中倒数第k个节点 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  7. vue项目发布后,线上运行时刷新404

    修改nginx配置文件 location / { root ... index ... try_files $uri $uri/ /index.html; ---解决页面刷新404问题 } (参考官网 ...

  8. 剖析Defi之Uinswap_0

    Uniswap是什么,不需要讲了吧.YYDS(永远嘀神) 介绍几个概念: 恒定乘积算法:可以简单看作X * Y = K,这里K(乘积)保持不变,所以叫恒定乘积算法,该函数是一个反曲线. 自动流动性协议 ...

  9. Java程序设计基础笔记 • 【第5章 循环结构】

    全部章节   >>>> 本章目录 5.1 while循环结构 5.1.1 循环简介 5.1.2 while循环 5.1.3 while循环的使用 5.1.4 while循环的注 ...

  10. Java面向对象笔记 • 【第8章 内部类和泛型】

    全部章节   >>>> 本章目录 8.1 内部类 8.1.1 内部类概述 8.1.2 内部类使用 8.1.3 实践练习 8.2 静态内部类 8.2.1 静态内部类的实现 8.2 ...