路由管理
路由注册
进入 internal/cmd
下的cmd.go
文件
1 函数注册
func (s *Server) BindHandler(pattern string, handler interface{})
pattern
为路由地址,handler
为访问api
时调用的函数
示例:
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()
s.BindHandler("/hello",func (r *ghttp.Request) {
r.Response.Write("hello")
})
s.Run()
return nil
},
浏览器访问127.0.0.1:8000/hello 即可看到响应结果
2 对象注册
func (s *Server) BindObject(pattern string, object interface{}, methods ...string) error
func (s *Server) BindObjectMethod(pattern string, object interface{}, method string) error
func (s *Server) BindObjectRest(pattern string, object interface{}) error
BindObject
方法:pattern/
method
为默认路由地址,object
为需要绑定的对象,methods是对象中需要注册方法,可以多个
BindObjectMethod
方法:与BindObject
方法的区别是method
只能有一个
示例:
var (
Main = gcmd.Command{
Name: "main",
Usage: "main",
Brief: "start http server",
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()
s.BindObject("/",NewHello())
// s.BindObjectMethod("/",NewHello(),"Hello") // BindObjectMethod方法
s.Run()
return nil
},
}
)
// 对象定义
type Hello struct {}
// 对象获取函数
func NewHello() *Hello{
return &Hello{}
}
// 函数实现
func(h *Hello) Hello(r *ghttp.Request) {
r.Response.Write("hello")
}
浏览器访问127.0.0.1:8000/hello 即可看到响应结果
BindObjectRest
方法: HTTP
的Method
将会映射到控制器对应的方法名称,方法名字不同的不会被映射到。
示例:
type Rest struct{}
func (c *Rest) Post(r *ghttp.Request) {
r.Response.Writeln("Post")
}
func (c *Rest) Get(r *ghttp.Request) {
r.Response.Writeln("Get")
}
func (c *Rest) Hello(r *ghttp.Request) {
r.Response.Writeln("Hello")
}
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()
s.BindObjectRest("/restful",new(Rest))
s.Run()
return nil
},
运行后可以看到Get和Post方法注册路由成功而Hello方法没有注册路由
3 分组路由
// 创建分组路由
func (s *Server) Group(prefix string, groups ...func(g *RouterGroup)) *RouterGroup
// 注册Method路由
func (g *RouterGroup) ALL(pattern string, object interface{}, params...interface{})
func (g *RouterGroup) GET(pattern string, object interface{}, params...interface{})
func (g *RouterGroup) PUT(pattern string, object interface{}, params...interface{})
func (g *RouterGroup) POST(pattern string, object interface{}, params...interface{})
func (g *RouterGroup) DELETE(pattern string, object interface{}, params...interface{})
// 中间件绑定
func (g *RouterGroup) Middleware(handlers ...HandlerFunc) *RouterGroup
// 批量注册
func (g *RouterGroup) Map(m map[string]interface{})
func (g *RouterGroup) ALLMap(m map[string]interface{})
ALL
可以被任意方式请求,GET,PUT,POST,DELETE
只响应对应方式的请求
示例:
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()
s.Group("/",func(group *ghttp.RouterGroup) {
group.ALL("/all", func(r *ghttp.Request) {
r.Response.Write("all")
})
group.GET("/get", func(r *ghttp.Request) {
r.Response.Write("get")
})
group.POST("/post", func(r *ghttp.Request) {
r.Response.Write("post")
})
group.DELETE("/delete", func(r *ghttp.Request) {
r.Response.Write("delete")
})
group.PUT("/put", func(r *ghttp.Request) {
r.Response.Write("put")
})
})
s.Run()
return nil
},
浏览器只能访问GET
方法和ALL
方法注册的路由,其他方法可以使用postman
进行请求
层级注册
group路由对象可以继续调用Group方法创建分组路由
示例:
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()
s.Group("/",func(group *ghttp.RouterGroup) {
group.Group("/group",func(group *ghttp.RouterGroup) {
group.GET("/hello",func (r *ghttp.Request) {
r.Response.Write("hello")
})
group.GET("/hi",func (r *ghttp.Request) {
r.Response.Write("hi")
})
})
})
s.Run()
return nil
},
浏览器下面两条地址可以看到不同的返回结果
4 规范路由
需要定义两个结构体,一个为请求结构体命名以Req
结尾,另一个为响应结构体命名以Res
结尾
// 请求结构体
type HelloReq struct{
g.Meta `path:"/hello" method:"get"`
Name string
}
// 响应结构体
type HelloRes struct{
Msg string
}
g.Meta
后的参数为路由地址和请求类型
请求中携带的参数名如果与HelloReq中同名会被映射到进获取的结构体实例中。
定义对象,使用对象注册,对象的方法需要按照以下示例中的格式
type Hello struct {}
func(h *Hello)Hello(ctx context.Context, req *HelloReq) (res *HelloRes, err error){
res = &HelloRes{
"hello!" + req.Name,
}
return
}
信息要想返回需要绑定中间件,可以绑定默认的响应中间件ghttp.MiddlewareHandlerResponse
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()
s.Use(ghttp.MiddlewareHandlerResponse) // use方法绑定中间件
s.Group("/", func(group *ghttp.RouterGroup) {
group.Bind(
new(Hello),
)
})
s.Run()
return nil
},
浏览器访问 127.0.0.1:8000/hello?name=zhangsan
可以看到响应信息: