hotime/.cursor/plans/集成请求参数获取方法_60cbd8aa.plan.md
hoteas b755519fc6 feat(cache): 优化缓存系统并重构数据库连接管理
- 将Redis连接方式改为连接池模式,提升连接复用效率
- 修复缓存注释错误,统一标识数据库缓存逻辑
- 添加数据检索结果非空验证,避免空指针异常
- 在数据库操作中添加读写锁保护,确保并发安全性
- 实现数据库查询和执行操作的重试机制,增强稳定性
- 更新配置文件中的缓存和数据库设置,优化缓存策略
- 重构README文档,补充框架特性和性能测试数据
- 添加示例路由配置,完善快速入门指南
2026-01-22 04:36:52 +08:00

4.9 KiB
Raw Blame History

name overview todos
集成请求参数获取方法 在 context.go 中为 Context 结构体添加五个请求参数获取方法ReqData统一获取、ReqDataParamsURL参数、ReqDataJsonJSON Body、ReqDataForm表单数据、ReqFile获取上传文件
id content status
add-imports 在 context.go 中添加 bytes、io、mime/multipart 包的导入 completed
id content status dependencies
impl-params 实现 ReqParam/ReqParams 方法(获取 URL 参数,返回 *Obj in_progress
add-imports
id content status dependencies
impl-form 实现 ReqForm/ReqForms 方法(获取表单数据,返回 *Obj pending
add-imports
id content status dependencies
impl-json 实现 ReqJson/ReqJsons 方法(获取 JSON Body返回 *Obj pending
add-imports
id content status dependencies
impl-file 实现 ReqFile/ReqFiles 方法(获取上传文件) pending
add-imports
id content status dependencies
impl-reqdata 实现 ReqData/ReqDatas 方法(统一获取,返回 *Obj pending
impl-params
impl-form
impl-json

集成请求参数获取方法

实现位置

context.go 中添加请求参数获取方法,风格与 Session("key") 保持一致,返回 *Obj 支持链式调用

新增方法

1. ReqParam - 获取 URL 查询参数(返回 *Obj

// 获取单个参数,支持链式调用
func (that *Context) ReqParam(key string) *Obj {
    // that.ReqParam("id").ToStr()
    // that.ReqParam("id").ToInt()
}

// 获取所有 URL 参数
func (that *Context) ReqParams() Map

2. ReqForm - 获取表单数据(返回 *Obj

// 获取单个表单字段
func (that *Context) ReqForm(key string) *Obj {
    // that.ReqForm("name").ToStr()
}

// 获取所有表单数据
func (that *Context) ReqForms() Map

3. ReqJson - 获取 JSON Body返回 *Obj

// 获取 JSON 中的单个字段
func (that *Context) ReqJson(key string) *Obj {
    // that.ReqJson("data").ToMap()
    // that.ReqJson("count").ToInt()
}

// 获取完整 JSON Body
func (that *Context) ReqJsons() Map

4. ReqFile - 获取上传文件

func (that *Context) ReqFile(name string) (multipart.File, *multipart.FileHeader, error)
func (that *Context) ReqFiles(name string) ([]*multipart.FileHeader, error)

5. ReqData - 统一获取参数(返回 *Obj

// 统一获取JSON > Form > URL支持链式调用
func (that *Context) ReqData(key string) *Obj {
    // that.ReqData("id").ToStr()
}

// 获取所有合并后的参数
func (that *Context) ReqDatas() Map

需要的导入

import (
    "bytes"
    "io"
    "mime/multipart"
)

关键实现细节

  1. Body 只能读取一次的问题:读取 Body 后需要用 io.NopCloser(bytes.NewBuffer(body)) 恢复,以便后续代码(如其他中间件)还能再次读取

  2. 废弃 API 替换:使用 io.ReadAll 替代已废弃的 ioutil.ReadAll

  3. 多值参数处理:当同一参数有多个值时(如 ?id=1&id=2),存储为 Slice;单值则直接存储字符串

使用示例

appIns.Run(Router{
    "app": {
        "user": {
            "info": func(that *Context) {
                // 链式调用获取单个参数(类似 Session 风格)
                id := that.ReqData("id").ToInt()           // 统一获取
                name := that.ReqParam("name").ToStr()      // URL 参数
                age := that.ReqForm("age").ToCeilInt()     // 表单参数
                data := that.ReqJson("profile").ToMap()    // JSON 字段
                
                // 获取所有参数(返回 Map
                allParams := that.ReqDatas()    // 合并后的所有参数
                urlParams := that.ReqParams()   // 所有 URL 参数
                formData := that.ReqForms()     // 所有表单数据
                jsonBody := that.ReqJsons()     // 完整 JSON Body
                
                that.Display(0, Map{"id": id, "name": name})
            },
            "upload": func(that *Context) {
                // 获取单个上传文件
                file, header, err := that.ReqFile("avatar")
                if err == nil {
                    defer file.Close()
                    // header.Filename - 文件名
                    // header.Size - 文件大小
                }
                
                // 获取多个同名上传文件
                files, err := that.ReqFiles("images")
            },
        },
    },
})

风格对比

| 旧方式(需要类型断言) | 新方式(链式调用) |

|------------------------|-------------------|

| req["id"].(string) | that.ReqData("id").ToStr() |

| ObjToInt(req["id"]) | that.ReqData("id").ToInt() |

| 需要手动处理 nil | *Obj 自动处理空值 |