01
介绍
beego 的路由功能非常强大,支持多种路由方式,包括固定路由,正则路由,自动路由等。
02
RESTful Controller 路由
beego 路由功能的执行顺序从前往后的优先级是:固定路由,正则路由和自动路由。beego 默认支持 RESTful 请求方式,即 Get HTTP 请求执行 Get 方法,Post HTTP 请求执行 Post 方法,Update HTTP 请求执行Update 方法,Delete HTTP 请求执行 Delete 方法。下面分别介绍这三种路由功能。
固定路由:
beego.Router("/", &controllers.MainController{}) beego.Router("/user", &controllers.UserController{})
如上所示,给 beego.Router() 方法传入两个参数,第一个参数是 URI,第二个参数是对应的 Controller。
固定路由规则中查找和请求 URL 相匹配的对象。这个匹配是全匹配规则,即如果用户请求的 URL 是 /hello/world,那么固定规则中 /hello 是不会匹配的,只有完全匹配才算匹配。如果匹配的话就进入逻辑执行,如果不匹配进入下一环节的正则匹配。
正则路由:
beego.Router("/user/:id([0-9]+)", &controllers.UserController{}) beego.Router("/user/:name([\\w]+)", &controllers.UserController{}) beego.Router("/user/:?id([0-9]+)", &controllers.UserController{}) beego.Router("/user/:id:int", &controllers.UserController{}) beego.Router("/user/:name:string", &controllers.UserController{}) beego.Router("/user/*.*", &controllers.UserController{}) beego.Router("/user/*", &controllers.UserController{})
正则匹配是进行正则的全匹配,这个正则是按照用户添加 beego 路由顺序来进行匹配的,也就是说,如果你在添加路由的时候你的顺序影响你的匹配。和固定匹配一样,如果匹配的话就进行逻辑执行,如果不匹配进入 Auto 匹配。
自动路由:
beego.AutoRouter(&controllers.UserController{})
首先把路由的控制器注册到自动路由中,然后 beego 就会通过反射获取该结构体中所有的实现方法,我们就可以通过访问 controller/method 这样的方式访问到对应的方法,除了前缀两个 /:controller/:method 的匹配之外,剩下的 url beego 会帮你自动化解析为参数,保存在 this.Ctx.Input.Params 当中。
如果用户注册了 AutoRouter,那么会通过 controller/method 这样的方式去查找对应的 Controller 和他内置的方法,如果找到就开始执行逻辑,如果找不到就跳转到监控判断。
自定义路由:
细心的读者可能已经发现,除了自动路由可以通过 method 名字访问对应的方法,固定路由和正则路由都是通过 HTTP Method 访问对应的方法,也就是说请求的 HTTP Method 和函数名一致,例如 GET 请求执行 Get 函数,POST 请求执行 Post 函数)。
如果用户期望自定义函数名,那么可以使用自定义路由,自定义路由默认不支持 RESTful 请求方式,需要指定对应 Http Method 的函数。
beego.Router("/user/list", &controllers.UserController, "*:List") beego.Router("/user/list", &controllers.UserController, "get:List") beego.Router("/user/list", &controllers.UserController, "post:List") beego.Router("/user/list", &controllers.UserController, "put:List") beego.Router("/user/list", &controllers.UserController, "delete:List") beego.Router("/user/list", &controllers.UserController, "get,post:List") beego.Router("/user/list", &controllers.UserController, "get:GetList;post:PostList") beego.Router("/user/list", &controllers.UserController, "*:List;post:PostList")
自定义路由就是给 beego.Router() 方法传入第三个参数,用来设置对应 HTTP Method 的自定义函数名,规则如下:
- 「*」星号代表所有 HTTP Method 都执行该函数。
- 使用 httpmethod:funcname 格式设置。
- 多个不同的格式之间使用「;」英文分号分隔。
- 多个 HTTP Method 对应同一个函数,HTTP Method 之间使用「,」英文逗号分隔。
- 如果同时存在「*」和 HTTP Method,优先执行 HTTP Method 对应的函数。
03
注解路由
除了上边讲的几种路由功能,beego 还支持注解路由,注解路由就是用户无需在 beego.router() 方法中注册路由,只需要在 beego.Include() 方法中注册相应的 controller,然后在 controller 的方法上写上 router 注释(// @router)。
注册 controller:
beego.Include(&controller@UserController)
controller 的方法上写上 router 注释:
type UserController struct { beego.Controller } // @router /user/list/:id([0-9]+) [get] func (u *UserController) List() { u.Ctx.WriteString("UserController@List func\n") id := u.Ctx.Input.Param(":id") u.Ctx.WriteString(id) }
只需上面简单两个步骤,beego 在 dev 模式下,就可以自动进行源码分析,生成的注释路由文件存放在 routers/ 目录中。
提醒:beego v2 不需要使用 beego.Include()注册 controller ,也可以自动生成注解路由文件,但是必须使用 beego.Include() 注册 controller,才可以 URL 访问到对应的方法。
04
命名空间
我们在接口开发时,经常要对接口的版本不断迭代升级,这时我们可以使用 beego 的 namespace,它非常强大,我们通过区分接口版本号演示它的使用方法。
ns := beego.NewNamespace("/v1", beego.NSRouter("/user/list", &controller.UserController{}, "get:List"), ) beego.AddNamespace(ns)
通过使用 namespace 封装,上面的接口可以这样访问:
GET /v1/user/list
而且 namespace 还支持前置过滤,条件判断和无限嵌套,如果想要了解更多关于 namespace 的功能,可以参阅官方文档。
05
RESTful 基础路由
上面讲的路由功能,全部都是访问 controller/method 的方式,有时我们可能只是写一些简单的业务逻辑,不需要使用 controller,我们可以这么做,beego 还支持由 URI 和闭包函数组成的路由。
beego.Get("/get", func(ctx *context.Context) { ctx.WriteString("get method") }) beego.Post("/post", func(ctx *context.Context) { ctx.WriteString("post method") }) beego.Any("/any", func(ctx *context.Context) { ctx.WriteString("all method") })
06
路由参数
路由参数:
this.Ctx.Input.Param(":id") this.Ctx.Input.Param(":name") this.Ctx.Input.Param(":path") this.Ctx.Input.Param(":ext") this.Ctx.Input.Param(":splat") this.Ctx.Input.Params()
this.Ctx.Input.Params() 是一个 map 类型。
07
总结
本文介绍了 beego 的所有路由方式和 beego 的 namespace,我们可以根据自己的业务需求选用最合适的路由方式,beego 的 namespace 在开发中非常有用,限于篇幅,我们只是简单介绍了一下 namespace,建议读者一定要通过阅读官方文档,了解更多关于 namespace 的用法。