Skip to content

参数获取

在 Gin 框架中,获取请求参数是一个常见操作。Gin 提供了多种方式来获取参数,具体方法取决于参数的来源,包括 路径参数查询参数表单参数JSON 参数 等。


1. 路径参数

路径参数(Route Parameters)是从 URL 中获取的参数。使用 Gin 的 :paramName 定义动态路由,然后通过 c.Param() 方法获取参数值。

示例:获取路径参数

go
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 时,返回结果:

json
{
  "userID": "123"
}

2. 查询参数

查询参数通常是 URL 中 ?key=value 的形式,使用 c.Query() 获取参数值。如果参数不存在,可以设置默认值或处理为空的情况。

示例:获取查询参数

go
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 时,返回结果:

json
{
  "keyword": "gin",
  "page": "2"
}

如果 page 未提供,如访问 http://localhost:8080/search?keyword=ginpage 默认值为 "1"


3. 表单参数

表单参数来源于 application/x-www-form-urlencodedmultipart/form-data 提交的表单。使用 c.PostForm() 获取表单参数。

示例:获取表单参数

go
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

返回结果:

json
{
  "username": "admin",
  "password": "1234"
}

4. JSON 参数

JSON 参数是从请求体中解析 JSON 数据,使用 c.BindJSON() 将其绑定到结构体或使用 c.GetRawData() 手动解析。

示例:获取 JSON 参数

go
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"
}

返回结果:

json
{
  "username": "admin",
  "password": "1234"
}

5. 多值参数

Gin 提供了 c.QueryArray()c.PostFormArray() 来获取多值参数。这对于复选框、多选下拉框等场景很有用。

示例:获取多值查询参数

go
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 返回:

json
{
  "tags": ["golang", "gin"]
}

6. Header 参数

Gin 可以通过 c.GetHeader() 获取请求头的值。

示例:获取 Header 参数

go
r.GET("/header", func(c *gin.Context) {
	authHeader := c.GetHeader("Authorization")
	c.JSON(http.StatusOK, gin.H{
		"Authorization": authHeader,
	})
})

发送请求头 Authorization: Bearer token123,返回:

json
{
  "Authorization": "Bearer token123"
}

7. 获取所有参数

Gin 提供了 c.Paramsc.QueryMap()c.PostFormMap() 来获取参数的所有键值对。

示例:获取所有查询参数

go
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

根据实际需求选择合适的方法,即可高效获取参数数据!