Golang Gin框架获取请求参数的几种常见方式

2024-03-01 0 706
目录
  • 传递参数的方式
    • Header
    • URL
    • HTTP Body
  • 直接获取请求参数
    • 获取URL Path中的参数
    • 获取URL Query中的参数
    • 获取HTTP Body中的参数
  • 绑定请求参数
    • 绑定Header参数
    • 绑定URL Path参数
    • 绑定URL Query参数
    • 绑定HTTP Body参数
    • 数据校验
  • 两种方式的对比
    • 小结

      传递参数的方式

      在一个HTTP请求中,一般可以把上传参数分为以下三个部分:

      Header

      Header是HTTP请求中一个键值对集合,HTTP规范定义了很多的Headeer,比如Content-Type,Accept等,不过也可以自定义请求头部或者响应头部。

      URL

      URL指的是请求路径,在请求路径上可以通过两种方式携带请求参数,一种是直接写在请求路径上的,称为URL Path:

      http://localhost:8080/user/add

      在URL上传递参数的另外一种方式就是URL Query,URL Query参数是指跟在?后面的键值对集合,多个参数之间以&分隔的:

      http://localhost:8080/user/add?name=小明&gender=男

      HTTP Body

      HTTP Body参数是指HTTP请求的请求体所携带的参数,这部分参数会因为Content-Type不同而不同,比如当Content-Type为application/json时,HTTO Body携带的是一串JSON字符串。

      那么,在Gin框架中,要如何获取这些请求参数呢?主要有以下两种方式:

      • 直接用Gin封装的方法获取请求参数
      • 通过绑定的方式来获取请求参数

      直接获取请求参数

      Gin框架在net/http包的基础上封装了获取参数的方式。

      获取URL Path中的参数

      在路由中使用通配符时,对应的通配符就会成为URL Path参数,调用gin.Context的Param()方法可以获取Path参数:

      package main

      func main(){
      engine := gin.Default()
      engine.GET(\”/user/:id\”, func(ctx *gin.Context) {
      id := ctx.Param(\”id\”)
      fmt.Fprintf(ctx.Writer, \”你的请求id:%s\”, id)
      })
      engine.Run()
      }

      运行后发起请求:

      $ curl http://localhost:8080/user/100
      你的请求id:100

      获取URL Query中的参数

      gin.Context对象提供了以下几个主要方法用于获取Query参数:

      package main

      import (
      \”fmt\”

      \”github.com/gin-gonic/gin\”
      )

      func main() {
      engine := gin.New()
      engine.GET(\”/user/list\”, func(ctx *gin.Context) {
      //获取单个值
      name := ctx.Query(\”name\”)
      //带默认值
      gender := ctx.DefaultQuery(\”gender\”, \”男\”)
      //数组
      habits := ctx.QueryArray(\”habits\”)
      //map
      works := ctx.QueryMap(\”works\”)
      fmt.Printf(\”%s,%s,%s,%s\\n\”, name, gender, habits, works)
      })

      engine.Run()
      }

      行后发起请求:

      curl -X GET \”http://localhost:8080/user/list?name=John&gender=男&habits[]=reading&habits[]=sports&works[teacher]=math&works[engineer]=computer\”
      John,男,[reading sports],map[engineer:computer teacher:math]

      获取HTTP Body中的参数

      对于通过HTTP Body传上来的参数,gin.Context也提供了几种主要方法用于获取:

      package main

      import (
      \”fmt\”

      \”github.com/gin-gonic/gin\”
      )

      func main() {
      engine := gin.New()
      engine.POST(\”/user/add\”, func(ctx *gin.Context) {
      //获取单个值
      name := ctx.PostForm(\”name\”)
      //带默认值
      gender := ctx.DefaultPostForm(\”gender\”, \”男\”)
      //数组
      habits := ctx.PostFormArray(\”habits\”)
      //map
      works := ctx.PostFormMap(\”works\”)
      fmt.Printf(\”%s,%s,%s,%s\\n\”, name, gender, habits, works)
      })

      engine.Run()
      }

      绑定请求参数

      Gin支持绑定Header,URL Path,URL Query以及HTTP Body等不同位置数据。

      绑定Header参数

      绑定Header参数可以使用BindHeader()或者ShouldBindHeader()方法:

      package main

      import (
      \”fmt\”
      \”net/http\”

      \”github.com/gin-gonic/gin\”
      )

      type testHeader struct {
      Rate int `header:\”Rate\”`
      Domain string `header:\”Domain\”`
      }

      func main() {
      r := gin.Default()
      r.GET(\”/\”, func(c *gin.Context) {
      h := testHeader{}

      if err := c.ShouldBindHeader(&h); err != nil {
      c.JSON(http.StatusBadRequest, err)
      return
      }

      fmt.Printf(\”%#v\\n\”, h)
      c.JSON(http.StatusOK, gin.H{\”Rate\”: h.Rate, \”Domain\”: h.Domain})
      })

      r.Run()
      }

      运行后的请求结果:

      $ curl -H \”rate:300\” -H \”test:123\” http://localhost:8080/
      {\”Test\”:\”123\”,\”Rate\”:300}

      绑定URL Path参数

      绑定URL Path参数可以使用BindUri()或者ShouldBindUri()方法:

      package main

      import (
      \”fmt\”
      \”net/http\”

      \”github.com/gin-gonic/gin\”
      )

      type User struct {
      Name string `uri:\”name\”`
      Email string `uri:\”email\”`
      }

      func main() {
      engine := gin.New()
      engine.GET(\”/user/list/:email/:name\”, func(ctx *gin.Context) {
      var u User
      if err := ctx.BindUri(&u);err != nil {
      ctx.JSON(http.StatusBadRequest, err)
      return
      }
      fmt.Fprintf(ctx.Writer, \”你输入的用户名为:%s,邮箱为:%s\\n\”, u.Name, u.Email)
      })
      engine.Run()
      }

      运行后的请求结果:

      curl -X GET \”http://localhost:8080/user/list/john@163.com/john
      你输入的用户名为:john,邮箱为:john@163.com

      绑定URL Query参数

      绑定URL Query参数可以使用BindQuery()、ShouldBindQury()、Bind()或者ShouldBind()方法:

      package main

      import (
      \”fmt\”
      \”net/http\”

      \”github.com/gin-gonic/gin\”
      )

      type User struct {
      Name string `form:\”name\”`
      Email string `form:\”email\”`
      }

      func main() {
      engine := gin.New()
      engine.GET(\”/user/list\”, func(ctx *gin.Context) {
      var u User
      if err := ctx.BindQuery(&u);err != nil {
      ctx.JSON(http.StatusBadRequest, err)
      return
      }
      fmt.Fprintf(ctx.Writer, \”你输入的用户名为:%s,邮箱为:%s\\n\”, u.Name, u.Email)
      })

      engine.Run()
      }

      运行后的请求结果:

      curl -X GET \”http://localhost:8080/user/list?email=john@163.com&name=john
      你输入的用户名为:john,邮箱为:john@163.com

      绑定HTTP Body参数

      我们知道HTTP Body的参数会根据不同Content-Type传不同格式的数据,Gin支持以下几种Content-Type类型的绑定:

      • JSON
      • XML
      • TOML
      • YAML
      • x-www-form-urlencoded
      • multipart/form-data

      注意HTTP Body的数据只在POST请求时才会进行绑定。

      绑定HTTP Body参数可以用Bind()和ShouldBind()方法,这两个方法会根据当前请求的Content-Type类型自动判断请求的类型。

      package main

      import (
      \”fmt\”
      \”net/http\”

      \”github.com/gin-gonic/gin\”
      )

      type User struct {
      Name string
      Email string
      }

      func main() {
      engine := gin.New()
      engine.POST(\”/user/add\”, func(ctx *gin.Context) {
      var u User
      if err := ctx.Bind(&u); err != nil {
      ctx.JSON(http.StatusBadRequest, err.Error())
      return
      }
      fmt.Fprintf(ctx.Writer, \”你输入的用户名为:%s,邮箱为:%s\\n\”, u.Name, u.Email)
      })
      engine.Run()
      }

      如果明确请求数据的类型,也可以直接调用对应类型绑定的方法,比如确定是JSON格式数据的话,可以调用BindJSON()或者ShouldBindJSON():

      package main

      import (
      \”fmt\”
      \”net/http\”

      \”github.com/gin-gonic/gin\”
      )

      type User struct {
      Name string
      Email string
      }

      func main() {
      engine := gin.New()
      engine.POST(\”/user/add\”, func(ctx *gin.Context) {
      var u User
      if err := ctx.BindJSON(&u); err != nil {
      ctx.JSON(http.StatusBadRequest, err.Error())
      return
      }
      fmt.Fprintf(ctx.Writer, \”你输入的用户名为:%s,邮箱为:%s\\n\”, u.Name, u.Email)
      })
      engine.Run()
      }

      对于x-www-form-urlencoded和multipart/form-data,与Qurey参数一样,结构体需要添加form的tag:

      package main

      import (
      \”fmt\”
      \”net/http\”

      \”github.com/gin-gonic/gin\”
      )

      type User struct {
      Name string `form:\”name\”`
      Email string `form:\”email\”`
      }

      func main() {
      engine := gin.New()
      engine.POST(\”/user/add\”, func(ctx *gin.Context) {
      var u User
      if err := ctx.Bind(&u); err != nil {
      ctx.JSON(http.StatusBadRequest, err.Error())
      return
      }
      fmt.Fprintf(ctx.Writer, \”你输入的用户名为:%s,邮箱为:%s\\n\”, u.Name, u.Email)
      })
      engine.Run()
      }

      数据校验

      在数据绑定的时候,也可以进行数据校验,这里我们为User结构体的标签添加了required属性,要求这个字段必须要有:

      package main

      import (
      \”fmt\”
      \”net/http\”

      \”github.com/gin-gonic/gin\”
      )

      type User struct {
      Name string `binding:\”required\”`
      Email string `binding:\”required\”`
      }

      func main() {
      engine := gin.New()
      engine.POST(\”/user/add\”, func(ctx *gin.Context) {
      var u User
      if err := ctx.Bind(&u); err != nil {
      ctx.JSON(http.StatusBadRequest, err.Error())
      return
      }
      fmt.Fprintf(ctx.Writer, \”你输入的用户名为:%s,邮箱为:%s\\n\”, u.Name, u.Email)
      })
      engine.Run()
      }

      两种方式的对比

      相较于直接获取请求参数,请求数据绑定是一种更强大且优雅的参数获取方式,使用这种方式获取参数有以下几个好处:

      • 直接将所有参数绑定到一个结构体中,不需要手动一个个地获取参数。
      • 绑定后的参数会自动转换为结构体对应字段的类型,不需要手动对每个参数进行数据类型转换。
      • 在进行数据绑定的同时还可以进行数据校验。

      小结

      直接获取请求参数虽然没有绑定参数那么强大,但对于简单的请求来说,也是够用的,因此,我们可以根据自己的需求,选择对应的方式来获取请求参数。

      以上就是Golang Gin框架获取请求参数的几种常见方式的详细内容,更多关于Golang Gin获取请求参数的资料请关注悠久资源网其它相关文章!

      您可能感兴趣的文章:

      • golang gin框架获取参数的操作
      • Golang使用Gin处理下载文件请求返回
      • Golang使用Gin框架实现路由分类处理请求流程详解
      • Golang Gin解析JSON请求数据避免出现EOF错误

      收藏 (0) 打赏

      感谢您的支持,我会继续努力的!

      打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
      点赞 (0)

      悠久资源 Golang Golang Gin框架获取请求参数的几种常见方式 https://www.u-9.cn/jiaoben/golang/179282.html

      常见问题

      相关文章

      发表评论
      暂无评论
      官方客服团队

      为您解决烦忧 - 24小时在线 专业服务