Gin 的基本使用
1 路由与请求处理
用 Gin 处理 HTTP 请求,先从路由开始。
1.1 路由注册
Gin 使用类似 HTTP 方法的函数来注册路由:
go
r := gin.Default()
handler := func(c *gin.Context) {}
r.GET("/path", handler)
r.POST("/path", handler)
r.PUT("/path", handler)
r.DELETE("/path", handler)每个方法接受一个路径和一个处理函数。
1.2 处理函数
处理函数签名为 func(*gin.Context),示例:
go
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})1.3 动态路由
支持路径参数:
go
r := gin.Default()
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(200, "Hello %s", name)
})1.4 查询参数
通过 c.Query 获取查询参数:
go
r := gin.Default()
r.GET("/welcome", func(c *gin.Context) {
firstname := c.DefaultQuery("firstname", "Guest")
lastname := c.Query("lastname")
c.String(200, "Hello %s %s", firstname, lastname)
})2 中间件
中间件在请求处理前后执行额外的操作,日志、鉴权、异常恢复都走这一层。
2.1 使用中间件
内置中间件:
go
r := gin.Default() // 包含 Logger 和 Recovery 中间件
r.GET("/ping", func(c *gin.Context) {})自定义中间件:
go
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
// 在请求处理前
t := time.Now()
// 处理请求
c.Next()
// 在请求处理后
latency := time.Since(t)
log.Print(latency)
}
}
func main() {
r := gin.New()
r.Use(Logger())
}2.2 中间件应用
中间件可以应用于路由组:
go
func AuthRequired() gin.HandlerFunc {
return func(c *gin.Context) {}
}
func main() {
r := gin.New()
loginEndpoint := func(c *gin.Context) {}
submitEndpoint := func(c *gin.Context) {}
authorized := r.Group("/", AuthRequired())
{
authorized.POST("/login", loginEndpoint)
authorized.POST("/submit", submitEndpoint)
}
}3 参数解析
Gin 提供了多种方式解析请求参数,包括路径参数、查询参数、表单参数和 JSON 参数。
3.1 表单参数
通过 c.PostForm 获取表单参数:
go
r := gin.Default()
r.POST("/form", func(c *gin.Context) {
name := c.PostForm("name")
message := c.PostForm("message")
c.JSON(200, gin.H{
"status": "posted",
"name": name,
"message": message,
})
})3.2 JSON 参数
通过 c.ShouldBindJSON 解析 JSON 参数:
go
package main
import "github.com/gin-gonic/gin"
type Login struct {
User string `json:"user"`
Password string `json:"password"`
}
func main() {
r := gin.Default()
r.POST("/login", func(c *gin.Context) {
var json Login
if err := c.ShouldBindJSON(&json); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
if json.User == "admin" && json.Password == "admin" {
c.JSON(200, gin.H{"status": "you are logged in"})
} else {
c.JSON(401, gin.H{"status": "unauthorized"})
}
})
}4 返回响应
Gin 提供了多种方式返回响应,包括字符串、JSON、XML等格式。
4.1 返回字符串
通过 c.String 返回字符串:
go
r := gin.Default()
r.GET("/string", func(c *gin.Context) {
c.String(200, "Hello, %s", "Gin")
})4.2 返回 JSON
通过 c.JSON 返回 JSON:
go
r := gin.Default()
r.GET("/json", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "hello world",
"status": "success",
})
})4.3 返回 XML
通过 c.XML 返回 XML:
go
r := gin.Default()
r.GET("/xml", func(c *gin.Context) {
c.XML(200, gin.H{
"message": "hello world",
"status": "success",
})
})5 错误处理
错误处理有两条路:内置的中止函数直接返回状态码,或者用中间件统一接住错误。
5.1 内置错误处理
通过 c.AbortWithStatus 或 c.AbortWithStatusJSON 返回错误状态码:
go
r := gin.Default()
r.GET("/abort", func(c *gin.Context) {
c.AbortWithStatusJSON(401, gin.H{"status": "unauthorized"})
})5.2 自定义错误处理
通过自定义中间件实现错误处理:
go
func ErrorHandler() gin.HandlerFunc {
return func(c *gin.Context) {
c.Next()
if len(c.Errors) > 0 {
c.JSON(-1, gin.H{"errors": c.Errors})
}
}
}
func main() {
r := gin.New()
r.Use(ErrorHandler())
}6 日志和恢复中间件
Gin 提供了 Logger 和 Recovery 中间件,用于日志记录和异常恢复。
6.1 日志中间件
默认启用日志中间件:
go
r := gin.Default() // 包含 Logger 中间件
r.GET("/ping", func(c *gin.Context) {})6.2 恢复中间件
默认启用恢复中间件,处理未捕获的异常:
go
r := gin.Default() // 包含 Recovery 中间件
r.GET("/ping", func(c *gin.Context) {})也可以单独使用:
go
r := gin.New()
r.Use(gin.Recovery())总结
这里整理 Gin 的六块常用功能:路由与请求处理、中间件、参数解析、返回响应、错误处理,以及内置的 Logger 和 Recovery 中间件。日常的接口开发,这些就够用了。