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