gin中模型的绑定和验证
要将请求体绑定到结构体中,使用模型绑定。 Gin目前支持JSON、XML、YAML和标准表单值的绑定(foo=bar&boo=baz)。
Gin使用 go-playground/validator/v10 进行验证。 查看标签用法的全部文档.
使用时,需要在要绑定的所有字段上,设置相应的tag。 例如,使用 JSON 绑定时,设置字段标签为 json:"fieldname"。
Gin提供了两类绑定方法:
- Type - Must bind
- Methods -
Bind,BindJSON,BindXML,BindQuery,BindYAML - 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等效方法。
- Methods -
- Type - Should bind
- Methods -
ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML - Behavior - 这些方法属于
ShouldBindWith的具体调用。 如果发生绑定错误,Gin 会返回错误并由开发者处理错误和请求。
- Methods -
使用 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中模型的绑定和验证的更多相关文章
- gin中multipart/urlencoded绑定
package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) ty ...
- asp.net core系列 45 Web应用 模型绑定和验证
一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到action方法参数. 这些参数可能是简单类型的参数,如字符串.整数或浮点数,也可能是复杂类型的参数. ...
- gin中如何自定义验证器
package main import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding&qu ...
- 理解Java中的前期绑定和后期绑定
前期绑定,在程序执行前根据编译时类型绑定,调用开销较小,如C语言只有前期绑定这种方法调用. 后期绑定,是指在运行时根据对象的类型进行绑定,又叫动态绑定或运行时绑定.实现后期绑定,需要某种机制支持,以便 ...
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...
- centos7中安装、配置、验证、卸载redis
本文介绍在centos7中安装.配置.验证.卸载redis等操作,以及在使用redis中的一些注意事项. 一 安装redis 1 创建redis的安装目录 利用以下命令,切换到/usr/local路径 ...
- python 机器学习中模型评估和调参
在做数据处理时,需要用到不同的手法,如特征标准化,主成分分析,等等会重复用到某些参数,sklearn中提供了管道,可以一次性的解决该问题 先展示先通常的做法 import pandas as pd f ...
- django中模型详解-字段类型与约束条件
这片博文来详细说明django模型的使用,涉及到django模型的创建,字段介绍,以及django模型的crud操作,以及一对一等操作. 在使用模型之前,我们首先设置数据库选项,django的默认数据 ...
- Django中模型(二)
Django中模型(二) 三.定义模型 1.模型.属性.表.字段间的关系: 一个模型类在数据库中对应一张表:在模型类中定义的属性,对应该模型对照表中的字段. 2.定义属性 A.概述 ·django根据 ...
随机推荐
- JAVA微信公众号网页开发——将文章群发到微信公众号中(文章使用富文本,包含图片)
SendTextToAllUserAct.java package com.weixin.sendmessage; import org.apache.commons.lang.StringUtils ...
- 升级shiro1.6版本后导致附件上传失败,浏览器返回400错误
最新shiro发布了一个漏洞,凡是jar包在1.6版本的都会出现该漏洞,要修复该漏洞只能升级到shiro1.6版本 但是如果项目中url使用了;jsessionid这种方式的话 就会导致上传失败,浏览 ...
- 【LeetCode】1071. Greatest Common Divisor of Strings 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力遍历 日期 题目地址:https://leetc ...
- Soldier and Traveling
B. Soldier and Traveling Time Limit: 1000ms Memory Limit: 262144KB 64-bit integer IO format: %I64d ...
- idea使用教程-常用快捷键
[1]创建内容:alt+insert [2]main方法:psvm [3]输出语句:sout [4]复制行:ctrl+d [5]删除行:ctrl+y [6]代码向上/下移动:Ctrl + Shift ...
- CS5218替代AG6310方案|设计DP转HDMI转换方案|替代AG6310方案
AG6310是一款实现显示端DP口转HDMI数据转换器.AG6310是一款单芯片解决方案,通过DP端口连接器传输视频和音频流,其DP1.2支持可配置的1.2和4通道,分别为1.62Gbps.2.7Gb ...
- Google面试评分卡
Google对工程面试之前,会让面试人员填一张评分卡,以加强面试官对你的理解,大致内容如下: 0 - 对于相关技术领域还不熟悉. 1 - 可以读懂这个领域的基础知识. 2 - 可以实现一些小的改动,清 ...
- 深入 Laravel 内核之工厂模式
英雄与行为,依赖的诞生 首先定义一个英雄,英雄具有一些行为: class Hero { protected $behavior = []; public function show() { var_d ...
- 发布 vscode 插件 Cnblogs Client For VSCode 预览版
为了方便大家使用 vscode 发布博文,我们做了一个小插件,今天发布预览版,欢迎大家试用并反馈问题与建议. 插件的英文名称是 Cnblogs Client For VSCode,简称是 vscode ...
- nginx rewrite 基础
一.跳转到首页 如果请求的页面不存在的话就跳转到首页 location / { if (!-e $request_filename){ rewrite ^/(.*) /ind ...