Beego的路由控制
二、路由控制
web框架中,路由是重要的一环,对于beego的路由配置如何?
2.1 默认路由
让我们从入口文件main.go先分析起来吧:
package mainimport (_ "beegoDemo/routers""github.com/astaxie/beego" )func main() {beego.Run() }
我们看到 main 函数是入口函数,但是我们知道 Go 的执行过程是如下图所示的方式:
这里我们就看到了我们引入了一个包 _ "beegoDemo/routers"
,这个包只引入执行了里面的 init 函数,那么让我们看看这个里面做了什么事情:
package routersimport ("beegoDemo/controllers""github.com/astaxie/beego" )func init() {beego.Router("/", &controllers.MainController{}) }
路由包里面我们看到执行了路由注册 beego.Router
, 这个函数的功能是映射 URL 到 controller,第一个参数是 URL (用户请求的地址),这里我们注册的是 /
,也就是我们访问的不带任何参数的 URL,第二个参数是对应的 Controller,也就是我们即将把请求分发到那个控制器来执行相应的逻辑,我们可以执行类似的方式注册如下路由:
beego.Router("/user", &controllers.UserController{})
看一下这个Router
的源码:
func Router(rootpath string, c ControllerInterface, mappingMethods ...string) *App {BeeApp.Handlers.Add(rootpath, c, mappingMethods...) return BeeApp }
我们beego的路由控制在router/router.go这个代码文件控制的,我们在init这个函数根据自己需求来更改路由规则了。
2.2 基础路由
beego 存在三种方式的路由:固定路由、正则路由、自动路由。
从 beego 1.2 版本开始支持了基本的 RESTful 函数式路由,应用中的大多数路由都会定义在 routers/router.go
文件中。最简单的 beego 路由由 URI 和闭包函数组成。
2.2.1 基本 GET 路由
beego.Get("/",func(ctx *context.Context){ctx.Output.Body([]byte("hello world")) })
2.2.2 基本 POST 路由
beego.Post("/alice",func(ctx *context.Context){ctx.Output.Body([]byte("wangergou")) })
2.2.3 注册一个可以响应任何 HTTP 的路由
beego.Any("/foo",func(ctx *context.Context){ctx.Output.Body([]byte("ruby")) })
2.2.4 所有的支持的基础函数如下所示
beego.Get(router, beego.FilterFunc)
beego.Post(router, beego.FilterFunc)
beego.Put(router, beego.FilterFunc)
beego.Patch(router, beego.FilterFunc)
beego.Head(router, beego.FilterFunc)
beego.Options(router, beego.FilterFunc)
beego.Delete(router, beego.FilterFunc)
beego.Any(router, beego.FilterFunc)
2.2.5 支持自定义的 handler 实现
有些时候我们已经实现了一些 rpc 的应用,但是想要集成到 beego 中,或者其他的 httpserver 应用,集成到 beego 中来。现在可以很方便的集成:
s := rpc.NewServer() s.RegisterCodec(json.NewCodec(), "application/json") s.RegisterService(new(HelloService), "") beego.Handler("/rpc", s)
beego.Handler(router, http.Handler)
这个函数是关键,第一个参数表示路由 URI,第二个就是你自己实现的 http.Handler
,注册之后就会把所有 rpc 作为前缀的请求分发到 http.Handler
中进行处理。
这个函数其实还有第三个参数就是是否是前缀匹配,默认是 false,如果设置了 true,那么就会在路由匹配的时候前缀匹配,即 /rpc/user
这样的也会匹配去运行。