获取Get参数
- 使用
c.DefaultQuery
- 使用
c.Query
- 使用
c.getQuery
r.GET("/web", func(c *gin.Context) {
x := c.Query("x")
y := c.DefaultQuery("y", "y")
z, ok := c.GetQuery("z")
if !ok {
z = "z"
}
c.JSON(200, gin.H{
"x": x,
"y": y,
"z": z,
})
})
获取表单参数
c.PostForm()
用于获取POST请求中表单参数的方法。c.PostForm()
只能获取application/x-www-form-urlencoded
或multipart/form-data
类型的表单数据。如果表单中不存在该字段,会返回空字符串。
func HandleForm(c *gin.Context) {
username := c.PostForm("username")
email := c.DefaultPostForm("email", "default@example.com")
if username == "" {
c.JSON(400, gin.H{
"error": "用户名不能为空"
})
return
}
// 处理表单数据
c.JSON(200, gin.H{
"username": username,
"email": email
})
}
添加中间件
r.Use()
是Gin框架中用于添加全局中间件的方法。中间件可以在处理请求之前或之后执行特定的操作,如日志记录、权限验证、跨域处理等。- 中间件按照添加的顺序依次执行
- 可以使用
c.Next()
继续处理请求 - 使用
c.Abort()
可以中断请求处理 - 中间件可以修改请求和响应
- 全局中间件会对所有路由生效
r := gin.Default()
// 添加一个简单的日志中间件
r.Use(gin.Logger())
// 添加全局错误恢复中间件
r.Use(gin.Recovery())
请求头/响应头
- 获取请求头
// 获取特定的请求头
userAgent := c.GetHeader("User-Agent")
// 也可以使用
contentType := c.Request.Header.Get("Content-Type")
- 设置响应头
// 设置单个响应头
c.Header("Content-Type", "application/json")
// 设置多个响应头
c.Header("X-Custom-Header", "Hello")
c.Header("Cache-Control", "no-cache")
绑定Uri
- 基本路径参数绑定,使用
c.Param
// 定义路由
r.GET("/user/:id", func(c *gin.Context) {
// 获取路径参数
id := c.Param("id")
c.JSON(200, gin.H{
"user_id": id,
})
})
- 多个路径参数,使用
c.Param
r.GET("/user/:name/profile/:id", func(c *gin.Context) {
name := c.Param("name")
id := c.Param("id")
c.JSON(200, gin.H{
"name": name,
"id": id,
})
})
- 结构体绑定,使用
c.ShouldBindUri
type UserParams struct {
ID string `uri:"id"`
Name string `uri:"name"`
}
func GetUser(c *gin.Context) {
var params UserParams
// 绑定URI参数到结构体
if err := c.ShouldBindUri(¶ms); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.JSON(200, gin.H{
"user_id": params.ID,
"name": params.Name,
})
}
// 路由定义
r.GET("/user/:name/:id", GetUser)
- 通配符参数,使用
c.Param
r.GET("/file/*filepath", func(c *gin.Context) {
// 匹配从 /file/ 开始的所有路径
filepath := c.Param("filepath")
c.JSON(200, gin.H{
"path": filepath,
})
})