Gin 如何只绑定/获取 URL 查询字符串参数?

47 min read

在 Gin 中,获取 URL 查询字符串参数可以使用 c.Query() 方法。该方法返回一个字符串表示查询字符串参数的值。

示例:

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

    r.GET("/api", func(c *gin.Context) {
        name := c.Query("name") // 获取 name 参数的值
        age := c.Query("age") // 获取 age 参数的值

        c.JSON(200, gin.H{
            "name": name,
            "age": age,
        })
    })

    r.Run(":8080")
}

你还可以使用 c.DefaultQuery() 方法获取默认值,如果查询参数不存在则返回该默认值。

示例:

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

    r.GET("/api", func(c *gin.Context) {
        name := c.DefaultQuery("name", "Gin") // 获取 name 参数的值,如果不存在则返回默认值 "Gin"
        age := c.DefaultQuery("age", "18") // 获取 age 参数的值,如果不存在则返回默认值 "18"

        c.JSON(200, gin.H{
            "name": name,
            "age": age,
        })
    })

    r.Run(":8080")
}

如果你只想绑定 URL 查询字符串参数到一个结构体中,可以使用 c.ShouldBindQuery() 方法。

示例:

type User struct {
    Name string `form:"name"`
    Age int `form:"age"`
}

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

    r.GET("/api", func(c *gin.Context) {
        var user User

        if err := c.ShouldBindQuery(&user); err != nil {
            c.JSON(400, gin.H{"error": err.Error()})
            return
        }

        c.JSON(200, gin.H{
            "name": user.Name,
            "age": user.Age,
        })
    })

    r.Run(":8080")
}

在上面的例子中,Gin 会将 URL 查询字符串参数绑定到 User 结构体中的对应字段。如果绑定失败,则返回错误。