01

介绍

beego 的路由功能非常强大,支持多种路由方式,包括固定路由,正则路由,自动路由等。

02

RESTful Controller 路由

beego 路由功能的执行顺序从前往后的优先级是:固定路由,正则路由和自动路由。beego 默认支持 RESTful 请求方式,即 Get HTTP 请求执行 Get 方法,Post HTTP 请求执行 Post 方法,Update HTTP 请求执行Update 方法,Delete HTTP 请求执行 Delete 方法。下面分别介绍这三种路由功能。

固定路由:

如上所示,给 beego.Router() 方法传入两个参数,第一个参数是 URI,第二个参数是对应的 Controller。

固定路由规则中查找和请求 URL 相匹配的对象。这个匹配是全匹配规则,即如果用户请求的 URL 是 /hello/world,那么固定规则中 /hello 是不会匹配的,只有完全匹配才算匹配。如果匹配的话就进入逻辑执行,如果不匹配进入下一环节的正则匹配。

正则路由:

正则匹配是进行正则的全匹配,这个正则是按照用户添加 beego 路由顺序来进行匹配的,也就是说,如果你在添加路由的时候你的顺序影响你的匹配。和固定匹配一样,如果匹配的话就进行逻辑执行,如果不匹配进入 Auto 匹配。

自动路由:

首先把路由的控制器注册到自动路由中,然后 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() 方法传入第三个参数,用来设置对应 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:

controller 的方法上写上 router 注释:

只需上面简单两个步骤,beego 在 dev 模式下,就可以自动进行源码分析,生成的注释路由文件存放在 routers/ 目录中。

提醒:beego v2 不需要使用 beego.Include()注册 controller ,也可以自动生成注解路由文件,但是必须使用 beego.Include() 注册 controller,才可以 URL 访问到对应的方法。

04

命名空间

我们在接口开发时,经常要对接口的版本不断迭代升级,这时我们可以使用 beego 的 namespace,它非常强大,我们通过区分接口版本号演示它的使用方法。

通过使用 namespace 封装,上面的接口可以这样访问:

GET /v1/user/list

05

RESTful 基础路由

上面讲的路由功能,全部都是访问 controller/method 的方式,有时我们可能只是写一些简单的业务逻辑,不需要使用 controller,我们可以这么做,beego 还支持由 URI 和闭包函数组成的路由。

06

路由参数

路由参数:

this.Ctx.Input.Params() 是一个 map 类型。

07

总结

bug list:

  1. 注解路由,不使用 beego.Include() 注册 controller,也可以生成注解路由文件,但是必须使用 beego.Include() 注册 controller,才可以通过 URL 访问到对应的方法。

以上 bug,已反馈给 beego 官方。