在 Web API 开发中,处理 路由参数(Path Parameter) 和 查询参数(Query Parameter) 是非常常见的需求。
Go 语言的 Gin 框架在这方面提供了简洁的 API,让你轻松获取和使用这些参数。
本文将通过一个完整的例子,带你掌握 Gin 中这两类参数的用法。
一、路由参数 vs 查询参数
1. 路由参数(Path Parameter)
-
• 出现在 URL 路径中
-
• 通常用于标识资源 ID
-
• 例如:
bashGET /users/123
这里
123
就是路由参数id
。
2. 查询参数(Query Parameter)
-
• 出现在
?
后面,以&
分隔 -
• 用于过滤、分页等非资源唯一标识的情况
-
• 例如:
iniGET /search?keyword=gin&page=2
二、Gin 获取路由参数和查询参数
Gin 通过 :param
定义路由参数,通过 c.Param()
获取;
查询参数可以用 c.Query()
或 c.DefaultQuery()
获取。
三、示例代码
go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
// 路由参数示例
r.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
c.JSON(http.StatusOK, gin.H{
"user_id": id,
})
})
// 查询参数示例
r.GET("/search", func(c *gin.Context) {
keyword := c.Query("keyword") // 没有默认值
page := c.DefaultQuery("page", "1") // 默认值为 1
c.JSON(http.StatusOK, gin.H{
"keyword": keyword,
"page": page,
})
})
// 组合使用
r.GET("/articles/:category", func(c *gin.Context) {
category := c.Param("category")
page := c.DefaultQuery("page", "1")
c.JSON(http.StatusOK, gin.H{
"category": category,
"page": page,
})
})
r.Run(":8080")
}
四、运行与测试
启动服务:
go
go run main.go
1. 测试路由参数
bash
curl http://localhost:8080/users/42
返回:
json
{"user_id":"42"}
2. 测试查询参数
arduino
curl "http://localhost:8080/search?keyword=gin&page=2"
返回:
json
{"keyword":"gin","page":"2"}
3. 路由参数 + 查询参数
arduino
curl "http://localhost:8080/articles/golang?page=3"
返回:
json
{"category":"golang","page":"3"}
五、注意事项
-
- 参数类型
Gin 获取到的参数是字符串,如果需要整数或浮点数,需要手动转换:
csspageNum, err := strconv.Atoi(c.DefaultQuery("page", "1"))
-
- 路由冲突
如果有多个类似
/users/:id
的路由,注意避免与静态路由冲突,比如/users/list
可能会被解析成id=list
。 -
- 默认值
查询参数建议用
c.DefaultQuery()
设置默认值,避免出现空字符串或 nil。
六、总结
通过 Gin,我们可以非常简洁地处理:
- • 路由参数:
c.Param("name")
- • 查询参数:
c.Query("key")
/c.DefaultQuery("key", "default")
在实际项目中,你可以将参数解析和验证抽取成中间件,提升代码可维护性。