Gin golang web开发模型绑定实现过程解析
作者:陈宏博 发布时间:2024-04-25 15:10:59
我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数。参数不多的情况下也很好用,但是想想看,如果接口有很多个参数的时候再用这种方法就要调用很多次获取参数的方法,本文将介绍一种新的接收参数的方法来解决这个问题:模型绑定。
gin中的模型绑定可以理解为:把请求的参数映射为一个具体的类型。gin支持JSON,XML,YAML和表单参数等多种参数格式,只需要在对应的字段上声明标签。
绑定表单或者查询字符串
type Person struct {
Name string `form:"name"`
Address string `form:"address"`
}
func startPage(c *gin.Context) {
var person Person
if c.ShouldBindQuery(&person) == nil {
log.Println(person.Name)
log.Println(person.Address)
}
c.String(200, "Success")
}
在结构体Name字段声明form标签,并调用ShouldBindQuery方法,gin会为我们绑定查询字符串中的name和address两个参数。注意虽然我们声明了form标签,ShouldBindQuery只绑定查询字符串中的参数。
如果你想绑定表单中的参数的话结构体不用改变,需要把ShouldBindQuery方更改为ShouldBind方法。ShouldBind方法会区分GET和POST请求,如果是GET请求绑定查询字符串中的参数,如果是POST请求绑定表单参数中的内容,但是不能同时绑定两种参数。
绑定json参数
type Person struct {
Name string `json:"name"`
Address string `json:"address"`
}
func startPage(c *gin.Context) {
var person Person
if c.ShouldBind(&person) == nil {
log.Println(person.Name)
log.Println(person.Address)
}
c.String(200, "Success")
}
json是一种常用的数据交换格式,尤其是在和web前端页面交互的时候,似乎已经成为了一种事实标准。gin绑定json格式数据方法很简单,只需要设置字段的标签为json并且调用ShouldBind方法。
其他类型参数绑定
路由参数在绑定时设置标签为uri,并调用ShouldBindUri方法。
type Person struct {
Id string `uri:"id"`
}
func startPage(c *gin.Context) {
var person Person
if c.ShouldBindUri(&person) == nil {
log.Println(person.Id)
}
c.String(200, "Success")
}
绑定在HTTP Header中的参数,字段的标签设置为header,调用方法为ShouldBindHeader。
还有不太常用的数组参数是字段标签设置为form:"colors[]",结构体例子如下:
type myForm struct {
Colors []string `form:"colors[]"`
}
文件上传这种场景我很少用模型绑定的方式获取参数,在gin中对于这种场景也提供了模型绑定支持。
type ProfileForm struct {
Name string `form:"name"`
Avatar *multipart.FileHeader `form:"avatar"`
// Avatars []*multipart.FileHeader `form:"avatar"` 多文件上传
}
func main() {
router := gin.Default()
router.POST("/profile", func(c *gin.Context) {
var form ProfileForm
if err := c.ShouldBind(&form); err != nil {
c.String(http.StatusBadRequest, "bad request")
return
}
err := c.SaveUploadedFile(form.Avatar, form.Avatar.Filename)
if err != nil {
c.String(http.StatusInternalServerError, "unknown error")
return
}
c.String(http.StatusOK, "ok")
})
router.Run(":8080")
}
多种类型的模型绑定
如果我们有一个UpdateUser接口,PUT /user/:id,参数是{"nickname": "nickname...","mobile": "13322323232"}。代码如下:
type ProfileForm struct {
Id int `uri:"id"`
Nickname string `json:"nickname"` // 昵称
Mobile string `json:"mobile"` // 手机号
}
func main() {
router := gin.Default()
router.GET("/user/:id", func(c *gin.Context) {
var form ProfileForm
if err := c.ShouldBindUri(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if err := c.ShouldBindJSON(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.String(http.StatusOK, "ok")
})
router.Run(":8080")
}
代码里调用了两次bind方法才获取到全部的参数。和gin社区沟通之后发现目前还不能调用一个方法同时绑定多个参数来源,当前gin版本为1.6.x,不知道未来会不会提供这种功能。
来源:https://www.cnblogs.com/huaface/p/13890194.html
猜你喜欢
- URL提交是百度提供的一个站长工具,用于给站长提供手工收录某些URL的接口,但是该接口有验证码识别部分,比较难弄。所以编写了如下程序进行验证
- 在日常工作或生活中,总避免不了需要操作文件或文件夹,比如希望找出电脑中所有临时文件并清除,或者找到指定文件夹内所有图片文件并进行重新命名等等
- jQuery 操作 CSSaddClass() - 向被选元素添加一个或多个类removeClass() - 从被选元素删除一个或多个类to
- 对于字典,通过“键”获得“值”非常简单,但通过“值”获得“键”则需绕些弯子。一、通用:自行定义函数方式假设:输入:一个字典(dic)+要找的
- 导语每日游戏更新系列——今天带大家来看看扫雷小游戏!它是许多人接触到的第一款游戏,大概也是广大办公族和无网学生无聊时消遣的最佳游戏。在那些还
- 结合邮件告警和页面展示,再多的域名证书到期情况即可立马知道代码示例:# coding: utf-8 # 查询域名证书到期情况import r
- 先前我们讲的都是“线性结构”,他的特征就是“一个节点最多有一个”前驱“和一个”后继“。那么我们今天讲的树会是怎样的呢?我们可以对”线性结构“
- 目录1. 理解 * 和 ** 2.Python函数的参数 3. 支持任意参数的函数
- 本文实例为大家分享了Python密码强弱判断的具体代码,供大家参考,具体内容如下程序说明:通过获取用户输入,判断密码长度是否大于8,同时判断
- 代码如下:<html> <head> &nb
- 目录前言🎪 一、Python 关键字🎢 二、Python标识符🎠 2.1 在 Python 中创建标识符的指南🎡 2.2 测试标识符是否有效
- sorted函数sorted(iterable,key,reverse)iterable 待排序的可迭代对象key 对应的是个函数, 该函数
- 背景:9月份有部分数据缺失,这部分数据在邮箱里,需要重新拉取,但是每天几百封邮件,总共有6、7万封邮件,使用stat()和retr(whic
- 一 什么是XML?python与json数据的交互详情 在这篇文章中我们介绍了json是一种独立于编程语言和平台的数据存储和交换方
- 赶快记录一下,只是懂皮毛,或许多积累就好了import sysfrom PyQt4 import QtGuiclass MainWindow
- 切片——str[start:end]str1 = ' python str '#切片
- 写在前面好久没更新Blog了,从CRUD Boy转型大数据开发,拉宽了不少的知识面,从今年年初开始筹备、组建、招兵买马,到现在稳定开搞中,期
- python-查找特定名称文件并按序号、文件名分行打印输出第1天第2题1.遍历”Day1-homework”目录下文件;2.找到文件名包含“
- Pytorch 使用GPU训练使用 GPU 训练只需要在原来的代码中修改几处就可以了。我们有两种方式实现代码在 GPU 上进行训练方法一 .
- 学习目标根据原型设计编译自动化数据生成器,熟悉wxPython的基本用法。界面原型设计界面原型设计分析输入参数:最大长度最小长度组成规则多少