★ 三种路由注册方式:函数/对象/规范路由对比

结论:GoFrame v2 支持函数注册、对象注册与规范路由注册三种方式;生产首选“规范路由”(Req/Res + g.Meta):参数自动绑定、v 标签自动校验、自动生成 OpenAPI 与统一返回,团队代码一致性最好。

一、三种方式要点

  1. 函数注册:s.BindHandler(pattern, handler),handler 为 func(r *ghttp.Request),最底层、最直白。
  2. 对象注册:s.BindObject(pattern, object, ...),将对象的公开方法按方法名映射为路由节点,适合把一组接口聚在对象上。
  3. 规范路由注册:handler 形如 func(ctx, *Req)(*Res, error),Req 内嵌 g.Meta 声明 method/path,注册后由框架自动完成路由与文档装配。

二、对比表

方式注册写法参数绑定自动校验OpenAPI推荐度
函数注册BindHandler("GET:/x", fn)手动 r.Get/Parse手动不支持简单接口
对象注册BindObject("/user", obj)手动/Parse手动v2 中少用
规范路由group.Bind(handler) + g.Meta自动自动(v 标签)自动生成生产首选

代码示例

函数注册:

s.BindHandler("GET:/hello", func(r *ghttp.Request) {
    r.Response.Write("hello")
})

对象注册:

type UserApi struct{}
func (a *UserApi) Info(r *ghttp.Request) { r.Response.Write("user info") }

s.BindObject("/user", new(UserApi)) // GET /user/info

规范路由注册:

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

s.Group("/", func(group *ghttp.RouterGroup) {
    group.Middleware(ghttp.MiddlewareHandlerResponse) // 统一返回
    group.Bind(Hello)                                 // 路由取自 g.Meta
})

常见追问 / 记忆点

  • 追问:同一接口能同时用两种方式注册吗?→ 可以但会路由冲突/重复注册,实践中一个接口固定一种注册方式。
  • 追问:函数注册支持指定 method 吗?→ 支持,pattern 可写作 "GET:/path"、"POST:/path" 等。
  • 记忆点:函数 = 最底层;对象 = 方法集映射;规范路由 = 约定 + 自动装配(v2 主推)。
笔记加载中…