今天就跟大家聊聊有关Gin golang web开发模型绑定,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
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,不知道未来会不会提供这种功能。
看完上述内容,你们对Gin golang web开发模型绑定有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。