当前位置: 首页 > ai >正文

Go语言实战案例:使用Gin处理路由参数和查询参数

在 Web API 开发中,处理 路由参数(Path Parameter) 和 查询参数(Query Parameter) 是非常常见的需求。
Go 语言的 Gin 框架在这方面提供了简洁的 API,让你轻松获取和使用这些参数。

本文将通过一个完整的例子,带你掌握 Gin 中这两类参数的用法。


一、路由参数 vs 查询参数

1. 路由参数(Path Parameter)

  • • 出现在 URL 路径中
  • • 通常用于标识资源 ID
  • • 例如:
    GET /users/123
    这里 123 就是路由参数 id

2. 查询参数(Query Parameter)

  • • 出现在 ? 后面,以 & 分隔
  • • 用于过滤、分页等非资源唯一标识的情况
  • • 例如:
    GET /search?keyword=gin&page=2

二、Gin 获取路由参数和查询参数

Gin 通过 :param 定义路由参数,通过 c.Param() 获取;
查询参数可以用 c.Query() 或 c.DefaultQuery() 获取。


三、示例代码

package mainimport ("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")     // 默认值为 1c.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 run main.go

1. 测试路由参数

curl http://localhost:8080/users/42

返回:

{"user_id":"42"}

2. 测试查询参数

curl "http://localhost:8080/search?keyword=gin&page=2"

返回:

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

3. 路由参数 + 查询参数

curl "http://localhost:8080/articles/golang?page=3"

返回:

{"category":"golang","page":"3"}

五、注意事项

  1. 1. 参数类型
    Gin 获取到的参数是字符串,如果需要整数或浮点数,需要手动转换:
    pageNum, err := strconv.Atoi(c.DefaultQuery("page", "1"))
  2. 2. 路由冲突
    如果有多个类似 /users/:id 的路由,注意避免与静态路由冲突,比如 /users/list 可能会被解析成 id=list
  3. 3. 默认值
    查询参数建议用 c.DefaultQuery() 设置默认值,避免出现空字符串或 nil。

六、总结

通过 Gin,我们可以非常简洁地处理:

  • • 路由参数:c.Param("name")
  • • 查询参数:c.Query("key") / c.DefaultQuery("key", "default")

在实际项目中,你可以将参数解析和验证抽取成中间件,提升代码可维护性。

http://www.xdnf.cn/news/17701.html

相关文章:

  • Nginx 超详细详解和部署实例
  • 【Python】新手入门:什么是python运算符?python运算符有哪些种类?运算符优先级是怎么样的?
  • 顺序表 —— OJ题
  • HarmonyOS Navigation路由跳转的完整示例
  • 用了Cursor AI之后,我的编程效率翻倍了?——一位程序员的真实体验分享
  • 区块链技术原理(9)-什么是以太币
  • 飞算JavaAI云原生实践:基于Docker与K8s的自动化部署架构解析
  • redis 内存使用率高居高不下,如何分析 key占用情况
  • Eclipse RCP产品动态模块设计
  • [AI React Web]`意图识别`引擎 | `上下文选择算法` | `url内容抓取` | 截图捕获
  • C++主流string的使用
  • 海康视觉平台VM创建项目
  • [Oracle数据库] ORACLE的用户维护和权限操作
  • 猫头虎AI分享:Excel MCP,让AI具备操作Excel表格|创建销售数据表、复制工作表、填充数据、写公式、绘制图表、调节颜色、添加透视表、保存为PDF
  • el-select如何获取到filterable过滤后的数据;el-select全选与filterable过滤组合使用;
  • Python 中使用多进程编程的“三两”问题
  • Gradle(三)创建一个 SpringBoot 项目
  • vue修改element的css属性
  • 8.13打卡 DAY 41 简单CNN
  • Android实现Glide/Coil样式图/视频加载框架,Kotlin
  • 前后端分离项目在云服务器的部署
  • vscode远程服务器出现一直卡在正在打开远程和连接超时解决办法
  • 通过限制网络访问来降低服务器被攻击风险的方法
  • Python uv的使用和配置
  • 《深入解析C++中的Map容器:键值对存储的终极指南》
  • Tigshop 跨境多语言多货币 JAVA / PHP 版本重磅更新v5.0.0发布
  • 友思特方案 | FPGA 加持,友思特图像采集卡高速预处理助力视觉系统运行提速增效
  • iscc2025区域赛wp
  • 下一代防火墙--NGAF
  • [Oracle数据库] Oracle的表维护