Goframe学习笔记(二)路由管理

路由管理

路由注册

进入 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方法: HTTPMethod将会映射到控制器对应的方法名称,方法名字不同的不会被映射到。

示例:

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方法没有注册路由

a22b976c1470455b9c883bcc271bbd69.png

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进行请求

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
        },

浏览器下面两条地址可以看到不同的返回结果

127.0.0.1:8000/group/hello

127.0.0.1:8000/group/hi

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

可以看到响应信息:

407b08668f704f568b62f94be67ca580.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值