★ 规范路由 Req/Res 模式与 g.Meta 标签

结论:规范路由是 GoFrame v2 主推的接口开发范式:用结构体定义入参 Req / 出参 Res,内嵌 g.Meta 声明 method/path/summary,处理器统一写作 func(ctx, *Req)(*Res, error);框架据此自动完成参数绑定、数据校验、统一返回与 OpenAPI 文档生成。

一、三个要素

  1. Req/Res 结构体:通常放 api 层,字段用 json/p/v 等标签描述参数名与校验规则。
  2. g.Meta:内嵌于 Req(也可用于 Res),method/path 决定注册路由,summary/tags/description 等用于接口文档。
  3. Handler 签名:func(ctx context.Context, req *api.XxxReq) (res *api.XxxRes, err error);返回 (nil, err) 即走统一错误返回。

二、为什么推荐

  • 参数绑定 + 校验被框架接管:Req 字段自动从 query/form/JSON body 解析,v 标签校验失败自动返回错误。
  • 输出统一:配合 MiddlewareHandlerResponse,自动包装为 {code, message, data},业务代码只 return res/err。
  • 文档自动:路由元数据齐全时自动生成 OpenAPI,天然适合前后端分离与 mock。

代码示例

type HelloReq struct {
    g.Meta `path:"/hello" method:"get" summary:"你好" tags:"示例"`
    Name string `json:"name" v:"required|length:1,20"`
}
type HelloRes struct{ Reply string `json:"reply"` }

func Hello(ctx context.Context, req *HelloReq) (res *HelloRes, err error) {
    res = &HelloRes{Reply: "Hello " + req.Name}
    return
}

func main() {
    s := g.Server()
    s.Group("/", func(group *ghttp.RouterGroup) {
        group.Middleware(ghttp.MiddlewareHandlerResponse) // 统一返回
        group.Bind(Hello)                                 // 路由由 g.Meta 自动生成
    })
    s.Run()
}

常见追问 / 记忆点

  • 追问:校验失败时前端拿到什么?→ 框架输出统一错误结构,code 对应 gcode 错误码(如校验失败相关错误码,以官方 gcode 定义为准)。
  • 追问:能不用 g.Meta 直接手写 pattern 吗?→ 可以,但会丢失文档/路由一致性优势,推荐以 g.Meta 为准。
  • 记忆点:Req 进、Res 出、err 判成败——“入参出参皆结构体,路由元数据写进 g.Meta”。
笔记加载中…