一个URL:/user?user_id=123456&name=sirxy&age=18,这这个URL中,其中user_id、name和age叫做GET请求参数。


在Gin中,可以通过下面的3个常用函数,获取GET请求参数。


2.1 Query函数,其源码如下:
// Query returns the keyed url query value if it exists,
// otherwise it returns an empty string `("")`.
// It is shortcut for `c.Request.URL.Query().Get(key)`
// GET /path?id=1234&name=Manu&value=
// c.Query("id") == "1234"
// c.Query("name") == "Manu"
// c.Query("value") == ""
// c.Query("wtf") == ""
func (c *Context) Query(key string) (value string) {
value, _ = c.GetQuery(key)
return
}

2.2. DefaultQuery函数,其源码如下:

// DefaultQuery returns the keyed url query value if it exists,
// otherwise it returns the specified defaultValue string.
// See: Query() and GetQuery() for further information.
//     GET /?name=Manu&lastname=
//     c.DefaultQuery("name", "unknown") == "Manu"
//     c.DefaultQuery("id", "none") == "none"
//     c.DefaultQuery("lastname", "none") == ""
func (c *Context) DefaultQuery(key, defaultValue string) string {
    if value, ok := c.GetQuery(key); ok {
        return value
    }
    return defaultValue
}

2.3. GetQuery函数,其源码如下:

// GetQuery is like Query(), it returns the keyed url query value
// if it exists `(value, true)` (even when the value is an empty string),
// otherwise it returns `("", false)`.
// It is shortcut for `c.Request.URL.Query().Get(key)`
//     GET /?name=Manu&lastname=
//     ("Manu", true) == c.GetQuery("name")
//     ("", false) == c.GetQuery("id")
//     ("", true) == c.GetQuery("lastname")
func (c *Context) GetQuery(key string) (string, bool) {
    if values, ok := c.GetQueryArray(key); ok {
        return values[0], ok
    }
    return "", false
}

现在,创建一个代码文件main.go,编写如下代码:

package main


import (
"github.com/gin-gonic/gin"
"net/http"
"fmt"
)


func main() {
r := gin.Default()


r.GET("/user", testGetParamHandler)


  r.Run()
}


func testGetParamHandler(c *gin.Context) {


// 获取请求参数的三种方式:


// 方式一:Query函数
name := c.Query("name")
fmt.Println("方式一:", name)


// 方式二:DefaultQuery函数
// 可以通过第二个参数设置默认值。
  name = c.DefaultQuery("name", "sirxy")
fmt.Println("方式二:", name)


// 方式三:GetQuery函数,
// 它返回两个参数,第一个是参数值,
// 第二个参数是参数是否存在的bool值,可以用来判断参数是否存在。
name, ok := c.GetQuery("name")
if !ok {
// 参数不存在逻辑
}
fmt.Println("方式三:", name)


// 其他业务逻辑


// 返回结果
c.JSON(http.StatusOK, gin.H{
"name": name,
})
}


运行代码,使用接口测试工具postman测试:


 

控制台终端中输出如下信息:

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET    /user                     --> main.testGetParamHandler (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
方式一:lisi
方式二:lisi
方式三:lisi
[GIN] 2021/10/13 - 15:04:08 | 200 |       516.7µs |       127.0.0.1 | GET      "/user?name=lisi"

PS1:GetQuery函数,判断参数是否存在的逻辑是,参数值为空,参数也算存在,只有没有提交参数,才算参数不存在。


PS2:上述三种get参数的获取,参数值都是String类型,若您的业务中约定了传的是数字,注意将字符串转为数字类型的处理。




■ ■■■■

3. POST请求参数处理


同样地,在Gin中,可以通过下面这3个常用函数,获取POST请求参数。