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

Gin 框架进阶系列(二):路由详解

Gin 框架进阶系列(二):路由详解


基本路由

Gin 支持所有标准 HTTP 方法:

r.GET("/user", getUser)
r.POST("/user", createUser)
r.PUT("/user", updateUser)
r.DELETE("/user", deleteUser)
r.PATCH("/user", patchUser)
r.OPTIONS("/user", optionsUser)
r.HEAD("/user", headUser)// 匹配所有方法
r.Any("/all", handler)

路径参数

// :name 必选参数
r.GET("/user/:id", func(c *gin.Context) {id := c.Param("id")c.JSON(200, gin.H{"id": id})
})// *action 通配参数,匹配后续所有路径
r.GET("/file/*filepath", func(c *gin.Context) {path := c.Param("filepath")c.JSON(200, gin.H{"path": path})
})
curl http://localhost:8080/user/42
# {"id":"42"}curl http://localhost:8080/file/static/css/main.css
# {"path":"/static/css/main.css"}

注意 :id 返回的是 string,需要自己转类型。通配参数 *filepath 的值带前导斜杠


查询参数

// GET /search?q=gin&page=1
r.GET("/search", func(c *gin.Context) {q := c.Query("q")               // 无值返回 ""page := c.DefaultQuery("page", "1") // 无值返回默认值c.JSON(200, gin.H{"q": q, "page": page})
})

QueryDefaultQuery 只取 URL 上的 query string。表单参数用 PostForm / DefaultPostForm,后续篇章会讲。


路由分组

项目一大,路由散落各处就是灾难。用 Group 分组:

func main() {r := gin.Default()// v1 版本v1 := r.Group("/api/v1"){v1.GET("/users", listUsers)v1.POST("/users", createUser)v1.GET("/users/:id", getUser)}// v2 版本v2 := r.Group("/api/v2"){v2.GET("/users", listUsersV2)}r.Run(":8080")
}

分组支持嵌套,也支持给分组单独加中间件

authorized := r.Group("/admin")
authorized.Use(AuthMiddleware())
{authorized.GET("/dashboard", dashboardHandler) // /admin/dashboardauthorized.GET("/profile", profileHandler)   // /admin/profileauthorized.POST("/settings", settingsHandler) // /admin/settings
}

花括号 {} 纯粹是代码风格,没有语法意义,只是让分组内的路由视觉上更清晰。


路由拆分

实际项目中不要把路由全堆在 main.go。推荐按模块拆文件:

router/
├── router.go       // 初始化引擎,注册各模块路由
├── user.go         // 用户相关路由
└── order.go        // 订单相关路由
// router/router.go
package routerimport "github.com/gin-gonic/gin"func Setup() *gin.Engine {r := gin.New()r.Use(gin.Logger(), gin.Recovery())RegisterUserRoutes(r)RegisterOrderRoutes(r)return r
}
// router/user.go
package routerimport "github.com/gin-gonic/gin"func RegisterUserRoutes(r *gin.Engine) {g := r.Group("/api/users"){g.GET("", listUsers)g.GET("/:id", getUser)g.POST("", createUser)}
}
// main.go
package mainimport "gin-blog/router"func main() {r := router.Setup()r.Run(":8080")
}

重定向

// HTTP 重定向
r.GET("/old", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "/new")
})// 路由内部重定向(不改变 URL)
r.GET("/internal", func(c *gin.Context) {c.Request.URL.Path = "/new"r.HandleContext(c)
})

404 与 405 处理

// 自定义 404
r.NoRoute(func(c *gin.Context) {c.JSON(404, gin.H{"code": 404, "msg": "page not found"})
})// 自定义 405(方法不允许)
r.NoMethod(func(c *gin.Context) {c.JSON(405, gin.H{"code": 405, "msg": "method not allowed"})
})

NoMethod 需要配合 r.HandleMethodNotAllowed = true 才生效,默认是关闭的。


小结

这篇覆盖了路由系统的核心内容:路径参数与查询参数的区别、分组与嵌套、路由拆分的工程实践、重定向。

下一篇进入请求处理:参数绑定、校验器(validator)与文件上传。

http://www.jsqmd.com/news/593198/

相关文章:

  • 阶跃星辰 GUI-MCP 解读---(1)---论文
  • 2026年支持Turnitin的降AI工具对比:留学生场景推荐 - 还在做实验的师兄
  • 基于Logisim与Verilog HDL的运动码表计时电路设计与DE2-70开发板验证
  • 告别繁琐下载:File Browser极简方案实现20+格式文件在线预览
  • t3mujinpack胶片模拟技术解析:基于Hald CLUT算法的开源胶片仿真实现
  • 如何系统化解决戴森球计划黑雾威胁:从自动化防御到资源管理的蓝图方案
  • Gin 框架进阶系列(六):Gin 认证与授权——JWT 鉴权实战
  • 2026年教育学论文降AI工具推荐:教学设计和调研分析部分如何降 - 还在做实验的师兄
  • 计算机毕业设计:Python二手车全栈数据洞察与价格预测系统 Django框架 可视化 线性回归 数据分析 机器学习 深度学习 AI 大模型(建议收藏)✅
  • dfs序
  • 3分钟学会OpenSpeedy游戏加速:免费开源打破帧率限制的终极指南
  • 如何用SillyTavern在5分钟内创建你的第一个AI虚拟伙伴?
  • Gin 框架进阶系列(七):Gin 统一响应与错误处理最佳实践
  • res-downloader:全平台网络资源下载工具的高效使用指南
  • 效果-Horizon 无限视界
  • Gin 框架进阶系列(零)
  • 2026年中医药论文降AI工具推荐:病案记录和方剂分析部分怎么处理 - 还在做实验的师兄
  • Gin 框架进阶系列(八):Web 安全攻防——原理、攻击与防御实践
  • AutoUnipus:智能刷课助手终极指南,2025年实现U校园全自动答题
  • Gin 框架进阶系列(三):请求处理
  • 实战避坑:用V4L2 API在RK3568上稳定获取IMX415摄像头码流的5个关键步骤
  • Ni8mare高危漏洞来袭:黑客可远程劫持n8n服务器(CVE-2026-21858)
  • D8 242. 移除链表元素
  • Scarab重构空洞骑士模组管理:智能依赖解析与自动化安装的革新实践
  • 提升游戏开发效率:用快马平台一键生成小恐龙游戏高质量基础模板
  • 2026年哪些写作习惯最容易被AIGC误判:特征分析和规避方法 - 还在做实验的师兄
  • 告别药物研发效率困境:用REINVENT4实现智能分子设计范式突破
  • OpenClaw 对接微信机器人配置全教程:从 0 到 1 搭建个人 AI 助手
  • Gin 框架进阶系列(四):中间件机制深入
  • 论文不同章节降AI策略不同:分章节精准处理的完整教程 - 还在做实验的师兄