要将请求体绑定到结构体中,使用模型绑定。 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. MySQL设置表中字段的数据唯一性

    mysql设置数据库表里的某个字段的数据是唯一的 ALTER TABLE 表名 ADD unique(`表中的字段`)

  2. 一个VScode主题网站

    分享一个我常用的VScode主题网站 https://vscodethemes.com/dark 它提供了 深色和浅色主题供大家选择 查看主题插件 下载 深色 浅色

  3. 【LeetCode】111. Minimum Depth of Binary Tree 解题报告(Python)

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

  4. 【LeetCode】899. Orderly Queue 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/orderly- ...

  5. 【LeetCode】61. Rotate List 解题报告(Python)

    [LeetCode]61. Rotate List 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...

  6. 1080 - Binary Simulation

    1080 - Binary Simulation    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 64 ...

  7. 基于内存的关系数据库memsql初探

    背景 广告系统中,算法模型预估需要根据广告的实时转化统计结果,才能做出更精准的预估:同时,支持多维度聚合查询(例如按照广告各个不同层级维度,按照时间不同粒度的维度),并跨大区合并.一开始的版本是基于m ...

  8. Laravel 使用 maatwebsite/excel 时长数字出现科学计数法的解决办法

    在使用 maatwebsite/excel 包导出Excel的时候,有的单元格里会存放手机号等一大串的数字,这一串数字会被Excel软件处理为科学计数法,在后续处理数据的时候会产生不小的麻烦,一个个去 ...

  9. Chapter 3 Observational Studies

    目录 概 3.1 3.2 Exchangeability 3.3 Positivity 3.4 Consistency First Second Fine Point 3.1 Identifiabil ...

  10. DEFENSE-GAN: PROTECTING CLASSIFIERS AGAINST ADVERSARIAL ATTACKS USING GENERATIVE MODELS

    目录 概 主要内容 Samangouei P, Kabkab M, Chellappa R, et al. Defense-GAN: Protecting Classifiers Against Ad ...