常用函数
Gin 框架中,gin.H
是一个高频使用的工具类型,其核心作用是简化 JSON 数据的构造和响应。
语法定义
gin.H
是 map[string]interface{}
的类型别名,源码中直接声明为:
type H map[string]interface{}
- 功能定位:用于快速构建键值对形式的动态数据结构
-
示例 :
r.GET("/user", func(c *gin.Context) { c.JSON(200, gin.H{ "profile": gin.H{ "name": "张三", "age": 25, "active": true, }, "roles": []string{"admin", "editor"}, }) }) //输出 { "profile": {"name": "张三", "age": 25, "active": true}, "roles": ["admin", "editor"] }
Gin 框架中,
c.JSON
和c.String
是用于向客户端返回 HTTP 响应的核心方法 -
c.String()
:返回纯文本或 HTML 内容
r.GET("/hello", func(c *gin.Context) {
name := c.Query("name")
c.String(200, "Welcome, %s!", name)
})
-
c.JSON()
:返回结构化 JSON 数据//使用 gin.H 快速构建键值对 c.JSON(200, gin.H{ "status": "success", "message": "Data loaded", }) //范湖结构体 type User struct { Name string `json:"name"` Age int `json:"age"` } r.GET("/user", func(c *gin.Context) { user := User{Name: "Bob", Age: 30} c.JSON(200, user) })
c.Redirect()
-
实现客户端 URL 跳转,适用于站外跳转或永久/临时资源迁移
//301 Moved Permanently
//资源永久迁移,搜索引擎更新索引:
c.Redirect(http.StatusMovedPermanently, "https://new-domain.com")
//302 Found(默认)
//资源临时迁移,浏览器下次仍访问原 URL:
c.Redirect(http.StatusFound, "/temporary-path")
//代码示例:
r.GET("/old", func(c *gin.Context) {
// 永久重定向到外部站点
c.Redirect(301, "https://example.com")
})
服务器内部跳转,客户端 URL 不变
//转发后的路由仍会经过全局中间件处理
//浏览器地址栏 URL 不变,但实际处理逻辑由新路由完成
r.GET("/a", func(c *gin.Context) {
// 内部转发到 /b 路由
c.Request.URL.Path = "/b"
r.HandleContext(c)
})
r.GET("/b", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "内部重定向成功"})
})
获取浏览器传递参数
-
URL 路径参数(动态路由参数)
适用于形如
/user/:id
的路由:
// 定义路由
r.GET("/user/:id", func(c *gin.Context) {{
id := c.Param("id") // 获取路径参数(如 /user/123)
}})
支持多级路径(如 /book/:category/:title
)
-
GET 参数(URL 查询参数)
通过 URL 的 ?
后传递的参数(如 /user?id=123
),使用以下方法获取:
c.Query("key")
获取单个参数,若不存在返回空字符串:id := c.Query("id") // 获取 id=123
c.DefaultQuery("key", "default")
参数不存在时返回默认值:page := c.DefaultQuery("page", "1") // 默认第一页
c.GetQuery("key")
返回参数值和是否存在标识:if name, exists := c.GetQuery("name"); exists {{ // 处理 name 参数 }}
c.QueryArray("key")
获取多值参数(如?ids=1&ids=2
):ids := c.QueryArray("ids") // []string{{"1", "2"}}
POST 参数(表单/Form 数据)
适用于
application/x-www-form-urlencoded
或multipart/form-data
格式的请求体:c.PostForm("key")
获取表单字段值:username := c.PostForm("username")
c.DefaultPostForm("key", "default")
字段不存在时返回默认值:age := c.DefaultPostForm("age", "18")
c.PostFormArray("key")
获取多值表单字段(如复选框):hobbies := c.PostFormArray("hobbies")
c.PostFormMap("key")
解析表单字段为 Map(如user[name]=John
):userMap := c.PostFormMap("user")
JSON 参数(请求体中的 JSON 数据)
适用于
application/json
格式的请求体:- 绑定到结构体(推荐)
定义结构体并使用ShouldBindJSON
:type User struct {{ Name string `json:"name"` Age int `json:"age"` }} var user User if err := c.ShouldBindJSON(&user); err == nil {{ fmt.Println(user.Name) // 直接访问字段 }}
- 原始数据读取
手动读取请求体并解析:
注意事项:需处理可能的 JSON 解析错误data, _ := c.GetRawData() // 获取原始字节流 json.Unmarshal(data, &user)
Gin设置 Cookie
c.SetCookie(
"user_id", // Cookie 名称
"123", // 值
3600, // 过期时间(秒)
"/", // 生效路径
"example.com", // 域名(可选)
false, // 仅 HTTPS 传输(Secure)
true, // 禁止 JS 访问(HttpOnly)
)
//关键参数说明:
//Secure=true:仅通过 HTTPS 传输,防止中间人窃取5。
//HttpOnly=true:禁止 JavaScript 访问,预防 XSS 攻击
userID, _ := c.Cookie("user_id") // 获取指定 Cookie
allCookies := c.Request.Cookies() // 获取所有 Cookie
c.SetCookie("user_id", "", -1, "/", "", false, true)//设置过期时间为负数即可删除:
Gin设置 Session
依赖第三方库 gin-contrib/sessions
go get github.com/gin-contrib/sessions
package main
import (
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
"time"
)
func main() {
r := gin.Default()
// 创建一个基于 Cookie 的会话存储
store := cookie.NewStore([]byte("secret"))
// 设置会话的最大存活时间为 10 分钟
store.Options(sessions.Options{
MaxAge: int(10 * time.Minute.Seconds()),
})
r.Use(sessions.Sessions("mysession", store))
// 设置会话
r.GET("/set", func(c *gin.Context) {
session := sessions.Default(c)
session.Set("user", "John Doe")
session.Save()
c.JSON(200, gin.H{"message": "Session set successfully"})
})
// 获取会话
r.GET("/get", func(c *gin.Context) {
session := sessions.Default(c)
user := session.Get("user")
c.JSON(200, gin.H{"user": user})
})
// 删除会话
r.GET("/delete", func(c *gin.Context) {
session := sessions.Default(c)
session.Delete("user")
session.Save()
c.JSON(200, gin.H{"message": "Session deleted successfully"})
})
r.Run(":8080")
}