3.1goweb框架gin中

 常用函数

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),使用以下方法获取:

  1. c.Query("key")
    获取单个参数,若不存在返回空字符串:

    id := c.Query("id") // 获取 id=123

  2. c.DefaultQuery("key", "default")
    参数不存在时返回默认值:

    page := c.DefaultQuery("page", "1") // 默认第一页

  3. c.GetQuery("key")
    返回参数值和是否存在标识:

    if name, exists := c.GetQuery("name"); exists {{ // 处理 name 参数 }}

  4. c.QueryArray("key")
    获取多值参数(如 ?ids=1&ids=2):

    ids := c.QueryArray("ids") // []string{{"1", "2"}}

    POST 参数(表单/Form 数据)

    适用于 application/x-www-form-urlencoded 或 multipart/form-data 格式的请求体:

  5. c.PostForm("key")
    获取表单字段值:

    username := c.PostForm("username")

  6. c.DefaultPostForm("key", "default")
    字段不存在时返回默认值:

    age := c.DefaultPostForm("age", "18")

  7. c.PostFormArray("key")
    获取多值表单字段(如复选框):

    hobbies := c.PostFormArray("hobbies")

  8. c.PostFormMap("key")
    解析表单字段为 Map(如 user[name]=John):

    userMap := c.PostFormMap("user")

    JSON 参数(请求体中的 JSON 数据)

    适用于 application/json 格式的请求体:

  9. 绑定到结构体(推荐)
    定义结构体并使用 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) // 直接访问字段 
    }}

  10. 原始数据读取
    手动读取请求体并解析:
    data, _ := c.GetRawData() // 获取原始字节流
    json.Unmarshal(data, &user)
    注意事项:需处理可能的 JSON 解析错误

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

基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业),个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业)基于Python的天气预测和天气可视化项目源码+文档说明(高分毕设/大作业
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chxii

小小打赏,大大鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值