千家信息网

Golang GinWeb框架之如何理解绑定请求字符串/URI/请求头/复选框/表单类型

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"Golang GinWeb框架之如何理解绑定请求字符串/URI/请求头/复选框/表单类型",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学
千家信息网最后更新 2026年11月03日Golang GinWeb框架之如何理解绑定请求字符串/URI/请求头/复选框/表单类型

这篇文章主要讲解了"Golang GinWeb框架之如何理解绑定请求字符串/URI/请求头/复选框/表单类型",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Golang GinWeb框架之如何理解绑定请求字符串/URI/请求头/复选框/表单类型"吧!

只绑定查询字符串

使用SholdBindQuery方法只绑定查询参数, 而不会绑定post的数据.

以下为示例代码与模拟测试请求:

package main  import (   "log"    "github.com/gin-gonic/gin" )  type Person struct {   Name    string `form:"name"`   Address string `form:"address"` }  func main() {   route := gin.Default()   route.Any("/testing", startPage)   route.Run(":8085") }  func startPage(c *gin.Context) {   var person Person   // ShouldBindQuery is a shortcut for c.ShouldBindWith(obj, binding.Query)   // ShouldBindQuery是c.ShouldBindWith(obj, binding.Query)方法的一个快捷绑定方法, 该方法只绑定请求字符串query string,而忽略Post提交的表单数据   if c.ShouldBindQuery(&person) == nil {     log.Println("====== Only Bind By Query String ======")     log.Println(person.Name)     log.Println(person.Address)   }   c.String(200, "Success") } //only bind query 模拟查询字符串请求 //curl -X GET "localhost:8085/testing?name=eason&address=xyz"  //only bind query string, ignore form data 模拟查询字符串请求和Post表单,这里的表单会被忽略 //curl -X POST "localhost:8085/testing?name=eason&address=xyz" --data 'name=ignore&address=ignore' -H "Content-Type:application/x-www-form-urlencoded

绑定查询字符串或Post数据(表单)

代码与请求示例:

package main  import (   "log"   "time"    "github.com/gin-gonic/gin" )  type Person struct {   Name       string    `form:"name"`   Address    string    `form:"address"`   Birthday   time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1"`   CreateTime time.Time `form:"createTime" time_format:"unixNano"`   UnixTime   time.Time `form:"unixTime" time_format:"unix"` }  func main() {   route := gin.Default()   //route.GET("/testing", startPage)           //使用GET   route.POST("/testing", startPage)  //使用POST   route.Run(":8085") }  func startPage(c *gin.Context) {   var person Person   // If `GET`, only `Form` binding engine (`query`) used.  如果路由是GET方法,则只使用查询字符串引擎绑定   // If `POST`, first checks the `content-type` for `JSON` or `XML`, then uses `Form` (`form-data`).   // See more at https://github.com/gin-gonic/gin/blob/master/binding/binding.go#L48   //如果是POST方式, ShouldBind方法检查请求类型头Content-Type来自动选择绑定引擎,比如Json/XML   if c.ShouldBind(&person) == nil {     log.Println(person.Name)     log.Println(person.Address)     log.Println(person.Birthday)     log.Println(person.CreateTime)     log.Println(person.UnixTime)   }    //if c.BindJSON(&person) == nil {   //  log.Println("====== Bind By JSON ======")   //  log.Println(person.Name)   //  log.Println(person.Address)   //}    c.String(200, "Success") } //模拟查询字符串参数请求: //curl -X GET "localhost:8085/testing?name=appleboy&address=xyz&birthday=1992-03-15&createTime=1562400033000000123&unixTime=1562400033" //模拟Post Json请求 //curl -X POST localhost:8085/testing --data '{"name":"JJ", "address":"xyz"}' -H "Content-Type:application/json"

绑定URI

将结构体中标签指定的字段与URI中对应的字段进行绑定, 详情请参考: https://github.com/gin-gonic/gin/issues/846

代码与请求示例:

package main  import "github.com/gin-gonic/gin"  type Person struct {   ID string `uri:"id" binding:"required,uuid"`  //指定URI标签   Name string `uri:"name" binding:"required"` }  func main() {   route := gin.Default()   //下面的URI中的name和id与Person结构中的标签分别对应   route.GET("/:name/:id", func(c *gin.Context) {     var person Person     if err := c.ShouldBindUri(&person); err != nil {       c.JSON(400, gin.H{"msg": err})       return     }     c.JSON(200, gin.H{"name": person.Name, "uuid": person.ID})   })   route.Run(":8088") } //模拟请求 //curl -v localhost:8088/thinkerou/987fbc97-4bed-5078-9f07-9141ba07c9f3 //curl -v localhost:8088/thinkerou/not-uuid

绑定请求头

将请求头中的信息与结构体绑定

package main  import (   "fmt"   "github.com/gin-gonic/gin" )  type testHeader struct {   Rate   int    `header:"Rate"`   //结构中添加header标签   Domain string `header:"Domain"` }  func main() {   r := gin.Default()   r.GET("/", func(c *gin.Context) {     h := testHeader{}      //ShouldBindHeader是c.ShouldBindWith(obj, binding.Header)的快捷方法     if err := c.ShouldBindHeader(&h); err != nil {       c.JSON(200, err)     }      fmt.Printf("%#v\n", h)     c.JSON(200, gin.H{"Rate": h.Rate, "Domain": h.Domain})   })    r.Run() }  //模拟请求 // curl -H "rate:300" -H "domain:music" http://localhost:8080/ // 参考输出: // {"Domain":"music","Rate":300}

绑定HTML复选框

将html与main.go放到一个目录,执行go run main.go运行后, 访问http://localhost:8080,勾选复选框,然后提交测试

main.go

package main  import (   "github.com/gin-gonic/gin" )  type myForm struct {   Colors []string `form:"colors[]"` //标签中的colors[]数组切片与html文件中的name="colors[]"对应 }  func main() {   r := gin.Default()    //LoadHTMLGlob采用通配符模式匹配HTML文件,并将内容进行渲染,提供给前端访问   r.LoadHTMLGlob("*.html")   r.GET("/", indexHandler)   r.POST("/", formHandler)    r.Run(":8080") }  func indexHandler(c *gin.Context) {   c.HTML(200, "form.html", nil) }  func formHandler(c *gin.Context) {   var fakeForm myForm   c.Bind(&fakeForm) //Bind方法根据请求头类型Content-Type, 自动选择合适的绑定引擎,如Json/XML   c.JSON(200, gin.H{"color": fakeForm.Colors}) }  //将html与main.go放到一个目录,执行go run main.go运行后, 访问http://localhost:8080,勾选复选框,然后提交测试

form.html

     

Check some colors

绑定Multipart/Urlencoded

使用ShouldBind方法结合结构体标签, 以及mime/multipart包完成多部分类型表单数据multipart/form-data或URL编码类型表单application/x-www-form-urlencoded数据进行绑定:

package main  import (   "github.com/gin-gonic/gin"   "mime/multipart"   "net/http" )  type ProfileForm struct {   Name   string                `form:"name" binding:"required"`   Avatar *multipart.FileHeader `form:"avatar" binding:"required"`    // or for multiple files   // Avatars []*multipart.FileHeader `form:"avatar" binding:"required"` }  func main() {   router := gin.Default()   router.POST("/profile", func(c *gin.Context) {     // you can bind multipart form with explicit binding declaration:  可以使用显示申明的方式,即用ShouldBindWith(&from, binding.Form)方法来绑定多部分类型表单multipart form     // c.ShouldBindWith(&form, binding.Form)     // or you can simply use autobinding with ShouldBind method:     var form ProfileForm     // in this case proper binding will be automatically selected     // 这里使用ShouldBind方法自动选择绑定器进行绑定     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     }     // db.Save(&form)     c.String(http.StatusOK, "ok")   })   router.Run(":8080") } //模拟测试: //curl -X POST -v --form name=user --form "avatar=@./avatar.png" http://localhost:8080/profile

感谢各位的阅读,以上就是"Golang GinWeb框架之如何理解绑定请求字符串/URI/请求头/复选框/表单类型"的内容了,经过本文的学习后,相信大家对Golang GinWeb框架之如何理解绑定请求字符串/URI/请求头/复选框/表单类型这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

表单 字符 字符串 方法 类型 复选框 查询 数据 标签 结构 框架 文件 测试 代码 内容 引擎 示例 学习 选择 参数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中智农互联网科技 互联网科技公司华为 互联网科技行业发展 互联网巨头反垄断金融科技 科技与互联网发展 中国互联网科技发展 互联网 视角下的科技创新 互联网金融 科技创新 佰商互联网科技有限公司 互联网科技有限公司 翻译 互联网科技素材视频竖屏 哈尔滨秒房互联网科技有限公司 宁夏众和广鑫互联网科技有限公司 互联网科技与管理 乌鲁木齐新华智原互联网科技学校 广州新华互联网科技学校电竞方面 济南小医互联网科技有限公司招聘 科技和互联网行业的特点 好易买互联网科技 互联网大会出现的黑科技 互联网属科技 互联网公司 科技公司 善班互联网科技有限公司 互联网科技美容 互联网 科技馆 广西互联网科技孵化中心 朱啸虎曾投资哪些互联网科技企业 互联网科技包装股份有限公司上市 互联网科技大佬云集 科技互联网专业务虚会材料
0