Gin 路由指南

Gin 框架路由模式:路由组、参数、查询字符串、通配符路由、自定义验证器和处理器组织。

1. 基本路由

r := gin.Default()

r.GET("/ping", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{"message": "pong"})
})

r.POST("/articles", createArticle)
r.PUT("/articles/:id", updateArticle)
r.DELETE("/articles/:id", deleteArticle)

r.Run(":8080")

2. 路由组

v1 := r.Group("/api/v1")
{
    articles := v1.Group("/articles")
    {
        articles.GET("", ListArticles)
        articles.POST("", CreateArticle)
        articles.GET("/:id", GetArticle)
    }

    auth := v1.Group("/users")
    auth.Use(AuthMiddleware())
    {
        auth.GET("/me", GetMe)
    }
}

3. 参数与查询字符串

r.GET("/articles/:id", func(c *gin.Context) {
    id := c.Param("id")
    c.JSON(200, gin.H{"id": id})
})

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})
})

4. 绑定与验证

type CreateArticleRequest struct {
    Title   string `json:"title"   binding:"required,min=5,max=300"`
    Content string `json:"content" binding:"required,min=50"`
    Status  string `json:"status"  binding:"omitempty,oneof=draft published"`
}

func CreateArticle(c *gin.Context) {
    var req CreateArticleRequest
    if err := c.ShouldBindJSON(&req); err != nil {
        c.JSON(http.StatusUnprocessableEntity, gin.H{"error": err.Error()})
        return
    }
    c.JSON(http.StatusCreated, gin.H{"ok": true})
}