路由基础

路由就是 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 会优先匹配更具体的路由。

404 处理

如果访问的路由不存在,Gin 默认返回 404。你可以自定义 404 处理:

r.NoRoute(func(c *gin.Context) {
    c.JSON(404, gin.H{
        "error": "页面不存在",
    })
})

405 处理

对于不支持的 HTTP 方法,Gin 返回 405。可以自定义:

r.NoMethod(func(c *gin.Context) {
    c.JSON(405, gin.H{
        "error": "方法不支持",
    })
})

小结

这一章学习了:

  • 如何注册路由
  • 路由匹配规则
  • 处理函数的写法
  • 自定义 404 和 405 处理