首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
Gin框架简介
Gin框架_Router
Gin框架_Model
Gin框架_响应
Gin框架_中间件
Gin框架_数据库
项目实战-项目介绍和项目搭建
项目实战_注册用户信息功能
项目实战-登录功能
项目实战-处理session
项目实战-添加新文章
项目实战-首页设计
项目实战-显示文章详情
项目实战-修改文章
项目实战-删除文章
项目实战-标签功能
项目实战-首页功能扩展
项目实战-文件上传和图片展示功能
项目实战-关于我
当前位置:
首页>>
技术小册>>
Gin框架入门教程
小册名称:Gin框架入门教程
###一、数据解析绑定 模型绑定可以将请求体绑定给一个类型。目前Gin支持JSON、XML、YAML和标准表单值的绑定。简单来说,,就是根据Body数据类型,将数据赋值到指定的结构体变量中 (类似于序列化和反序列化) 。 Gin提供了两套绑定方法: ###Must bind 方法:Bind,BindJSON,BindXML,BindQuery,BindYAML 行为:这些方法使用MustBindWith。如果存在绑定错误,则用c终止请求,使用c.AbortWithError (400) .SetType (ErrorTypeBind)即可。将响应状态代码设置为400,Content-Type header设置为text/plain;charset = utf - 8。请注意,如果在此之后设置响应代码,将会受到警告:[GIN-debug][WARNING] Headers were already written. Wanted to override status code 400 with 422将导致已经编写了警告[GIN-debug][warning]标头。如果想更好地控制行为,可以考虑使用ShouldBind等效方法。 Should bind 方法:ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML 行为:这些方法使用ShouldBindWith。如果存在绑定错误,则返回错误,开发人员有责任适当地处理请求和错误。 注意,使用绑定方法时,Gin 会根据请求头中 Content-Type 来自动判断需要解析的类型。如果你明确绑定的类型,你可以不用自动推断,而用 BindWith 方法。 你也可以指定某字段是必需的。如果一个字段被binding:"required"修饰而值却是空的,请求会失败并返回错误。 ###二、JSON绑定 JSON的绑定,其实就是将request中的Body中的数据按照JSON格式进行解析,解析后存储到结构体对象中。新建一个go文件,demo09_bind.go: ``` package main import ( "github.com/gin-gonic/gin" "net/http" ) type Login struct { User string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"` Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"` } func main() { router := gin.Default() //1.binding JSON // Example for binding JSON ({"user": "hanru", "password": "hanru123"}) router.POST("/loginJSON", func(c *gin.Context) { var json Login //其实就是将request中的Body中的数据按照JSON格式解析到json变量中 if err := c.ShouldBindJSON(&json); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } if json.User != "hanru" || json.Password != "hanru123" { c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) return } c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) }) router.Run(":8080") } ``` 前面我们使用c.String返回响应,顾名思义则返回string类型。content-type是plain或者text。调用c.JSON则返回json数据。其中gin.H封装了生成json的方式,是一个强大的工具。使用golang可以像动态语言一样写字面量的json,对于嵌套json的实现,嵌套gin.H即可。 然后打开终端输入以下命令: hanru:~ ruby$ curl -v -X POST http://127.0.0.1:8080/loginJSON -H 'content-type:application/json' -d '{"user":"hanru","password":"hanru123"}' 可以返回正确的结果。  假如我们传递的json中只有user数据: hanru:~ ruby$ curl -v -X POST http://127.0.0.1:8080/loginJSON -H 'content-type:application/json' -d '{"user":"hanru"}' 那么会得到一个错误信息:  ###三、Form表单 其实本质是将c中的request中的body数据解析到form中。首先我们先看一下绑定普通表单的例子: 在之前的代码demo09上继续添加就行: ``` // 3. Form 绑定普通表单的例子 // Example for binding a HTML form (user=hanru&password=hanru123) router.POST("/loginForm", func(c *gin.Context) { var form Login //方法一:对于FORM数据直接使用Bind函数, 默认使用使用form格式解析,if c.Bind(&form) == nil // 根据请求头中 content-type 自动推断. if err := c.Bind(&form); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } if form.User != "hanru" || form.Password != "hanru123" { c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) return } c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) }) ``` html页面,我们可以使用之前的login.html,但是要记得修改action后的路径:http://127.0.0.1:8080/loginForm  ``` router.POST("/login", func(c *gin.Context) { var form Login //方法二: 使用BindWith函数,如果你明确知道数据的类型 // 你可以显式声明来绑定多媒体表单: // c.BindWith(&form, binding.Form) // 或者使用自动推断: if c.BindWith(&form, binding.Form) == nil { if form.User == "user" && form.Password == "password" { c.JSON(200, gin.H{"status": "you are logged in ..... "}) } else { c.JSON(401, gin.H{"status": "unauthorized"}) } } }) ``` 运行结果:  ###四、Uri绑定 ``` // 5.URI router.GET("/:user/:password", func(c *gin.Context) { var login Login if err := c.ShouldBindUri(&login); err != nil { c.JSON(400, gin.H{"msg": err}) return } c.JSON(200, gin.H{"username": login.User, "password": login.Password}) }) ``` 打开终端输入以下内容: ``` hanru:~ ruby$ curl -v http://127.0.0.1:8080/hanru/hanru123 ``` 运行结果: 
上一篇:
Gin框架_Router
下一篇:
Gin框架_响应
该分类下的相关小册推荐:
gin框架入门指南