路由就是 URL 和处理函数代码的映射关系。当用户访问某个 URL 时,框架会找到对应的处理函数并执行。
Gin 提供了简洁的 API 来注册路由:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello World")
})
r.POST("/submit", func(c *gin.Context) {
c.String(200, "Form submitted")
})
r.Run(":8080")
}
Gin 的路由匹配遵循这些规则:
r.GET("/users", handleUsers)
只有访问 /users 才会匹配,/users/ 不会匹配。
r.GET("/users/:id", handleUser)
/users/123 会匹配,id 的值是 123。
r.GET("/files/*filepath", handleFile)
/files/a/b/c.txt 会匹配,filepath 的值是 /a/b/c.txt。
处理函数是路由的核心,它接收一个 *gin.Context 参数:
func handler(c *gin.Context) {
c.String(200, "Response")
}
gin.Context 包含了请求的所有信息,也提供了响应的方法。
func home(c *gin.Context) {
c.String(200, "Welcome home")
}
func main() {
r := gin.Default()
r.GET("/", home)
r.Run(":8080")
}
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
Gin 的路由匹配不是按照注册顺序来的,而是根据路由树查找。所以路由的注册顺序不影响匹配结果。
r.GET("/users/:id", handleUser)
r.GET("/users/new", handleNewUser)
访问 /users/new 会匹配到 handleNewUser,而不是 handleUser。Gin 会优先匹配更具体的路由。
如果访问的路由不存在,Gin 默认返回 404。你可以自定义 404 处理:
r.NoRoute(func(c *gin.Context) {
c.JSON(404, gin.H{
"error": "页面不存在",
})
})
对于不支持的 HTTP 方法,Gin 返回 405。可以自定义:
r.NoMethod(func(c *gin.Context) {
c.JSON(405, gin.H{
"error": "方法不支持",
})
})
这一章学习了: