参数获取
在 Gin 框架中,获取请求参数是一个常见操作。Gin 提供了多种方式来获取参数,具体方法取决于参数的来源,包括 路径参数、查询参数、表单参数 和 JSON 参数 等。
1. 路径参数
路径参数(Route Parameters)是从 URL 中获取的参数。使用 Gin 的 :paramName 定义动态路由,然后通过 c.Param() 方法获取参数值。
示例:获取路径参数
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
// 定义动态路径参数
r.GET("/user/:id", func(c *gin.Context) {
id := c.Param("id") // 获取路径参数 id
c.JSON(http.StatusOK, gin.H{
"userID": id,
})
})
r.Run(":8080")
}访问 http://localhost:8080/user/123 时,返回结果:
{
"userID": "123"
}2. 查询参数
查询参数通常是 URL 中 ?key=value 的形式,使用 c.Query() 获取参数值。如果参数不存在,可以设置默认值或处理为空的情况。
示例:获取查询参数
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/search", func(c *gin.Context) {
keyword := c.Query("keyword") // 获取查询参数
page := c.DefaultQuery("page", "1") // 设置默认值
c.JSON(http.StatusOK, gin.H{
"keyword": keyword,
"page": page,
})
})
r.Run(":8080")
}访问 http://localhost:8080/search?keyword=gin&page=2 时,返回结果:
{
"keyword": "gin",
"page": "2"
}如果 page 未提供,如访问 http://localhost:8080/search?keyword=gin,page 默认值为 "1"。
3. 表单参数
表单参数来源于 application/x-www-form-urlencoded 或 multipart/form-data 提交的表单。使用 c.PostForm() 获取表单参数。
示例:获取表单参数
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.POST("/form", func(c *gin.Context) {
username := c.PostForm("username") // 获取表单参数
password := c.DefaultPostForm("password", "") // 设置默认值
c.JSON(http.StatusOK, gin.H{
"username": username,
"password": password,
})
})
r.Run(":8080")
}发送表单请求:
POST /form
Content-Type: application/x-www-form-urlencoded
username=admin&password=1234返回结果:
{
"username": "admin",
"password": "1234"
}4. JSON 参数
JSON 参数是从请求体中解析 JSON 数据,使用 c.BindJSON() 将其绑定到结构体或使用 c.GetRawData() 手动解析。
示例:获取 JSON 参数
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type LoginRequest struct {
Username string `json:"username"`
Password string `json:"password"`
}
func main() {
r := gin.Default()
r.POST("/login", func(c *gin.Context) {
var req LoginRequest
if err := c.BindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{
"username": req.Username,
"password": req.Password,
})
})
r.Run(":8080")
}发送 JSON 请求:
POST /login
Content-Type: application/json
{
"username": "admin",
"password": "1234"
}返回结果:
{
"username": "admin",
"password": "1234"
}5. 多值参数
Gin 提供了 c.QueryArray() 和 c.PostFormArray() 来获取多值参数。这对于复选框、多选下拉框等场景很有用。
示例:获取多值查询参数
r.GET("/tags", func(c *gin.Context) {
tags := c.QueryArray("tag")
c.JSON(http.StatusOK, gin.H{
"tags": tags,
})
})访问 http://localhost:8080/tags?tag=golang&tag=gin 返回:
{
"tags": ["golang", "gin"]
}6. Header 参数
Gin 可以通过 c.GetHeader() 获取请求头的值。
示例:获取 Header 参数
r.GET("/header", func(c *gin.Context) {
authHeader := c.GetHeader("Authorization")
c.JSON(http.StatusOK, gin.H{
"Authorization": authHeader,
})
})发送请求头 Authorization: Bearer token123,返回:
{
"Authorization": "Bearer token123"
}7. 获取所有参数
Gin 提供了 c.Params、c.QueryMap() 和 c.PostFormMap() 来获取参数的所有键值对。
示例:获取所有查询参数
r.GET("/all", func(c *gin.Context) {
params := c.Request.URL.Query() // 获取所有查询参数
c.JSON(http.StatusOK, gin.H{
"params": params,
})
})总结
| 参数类型 | 方法 | 示例 |
|---|---|---|
| 路径参数 | c.Param("key") | /user/:id -> c.Param("id") |
| 查询参数 | c.Query("key") | ?key=value -> c.Query("key") |
| 表单参数 | c.PostForm("key") | form-data or x-www-form-urlencoded |
| JSON 参数 | c.BindJSON(&obj) | { "key": "value" } |
| Header 参数 | c.GetHeader("key") | Authorization: Bearer ... |
| 多值参数 | c.QueryArray("key") | ?key=value1&key=value2 |
根据实际需求选择合适的方法,即可高效获取参数数据!