Beego路由设置
1.路由设置
Beego支持的路由的方式:
固定路由、正则路由和自动路由。
1.1固定路由
介绍:完全匹配的路由,只有你请求的url匹配到了对应的路由,才会找对应的函数。
一个简单的例子:
//在controllers中定义
type MainController struct {
beego.Controller
}
func (this *MainController) Get(){
this.Data["json"]= "Hello World"
this.ServeJSON()
}
//在Router.go中添加
func init() {
···
beego.Router("/", &controllers.MainController{})
···
}
这个时候我们请求/目录就会返回 Helllo World
了
jiangfeng@192 ~ curl "http://localhost:8080/"
"Hello World"%
一个自定义方法的例子:
//在controllers中定义
func (this *MainController) Hehe(){
this.Data["json"]= "Hehe"
this.ServeJSON()
}
//router.go 文件中添加如下:
beego.Router("/admin/", &controllers.MainController{}, "get:Hehe")
1.2正则路由
介绍:路由中添加了正则表达式,可以更方便的做匹配。
一个简单的例子:
//复用了Get()函数
//在router.go中添加如下代码
beego.Router("/api/:id", &controllers.MainController{})
这个时候,单请求/api
是无法找到正确的路由的,必须携带id信息才可以
jiangfeng@192 ~ curl -I "http://localhost:8080/api/"
HTTP/1.1 404 Not Found
Server: beegoServer:2.0.0
Date: Tue, 27 Apr 2021 15:32:45 GMT
Content-Length: 2000
Content-Type: text/html; charset=utf-8
jiangfeng@192 ~ curl "http://localhost:8080/api/id=1"
"Hello World"
1.3自动匹配(注解路由)
介绍:不需要频繁的在router.go
文件中定义,在控制器函数上行使用代码标注就好。beego默认会在router目录下创建一个commentsRouter_controllers.go文件,这里生成好了路由信息。
举个栗子:
//Controllers 中定义函数
type BasesController struct {
beego.Controller
}
// @router /asd/?:id [get]
func (this *BasesController) Asd() {
this.Ctx.WriteString(this.Ctx.Input.Param(":id"))
}
//在router.go中注册路由:
beego.Include(&controllers.BasesController{})
ps:
- BaseControllers 不能使用,一使用就报错,可能Beego有内部使用吧,没有仔细看过源码
@router
这一行是必填项,用来做标识。- 注意只会在 dev 模式下进行生成,生成的路由放在 “/routers/commentsRouter.go” 文件中。
关于官网介绍的URLMapping 函数,本人测试不注册的情况下,没有找到控制器的。但是速度测试是有提高的,如果为了提高效率,还是可以添加的。
官网介绍:
同时大家注意到新版本里面增加了 URLMapping 这个函数,这是新增加的函数,用户如果没有进行注册,那么就会通过反射来执行对应的函数,如果注册了就会通过 interface 来进行执行函数,性能上面会提升很多。
//例子:
func (c *CMSController) URLMapping() {
c.Mapping("StaticBlock", c.StaticBlock)
c.Mapping("AllBlock", c.AllBlock)
}
自动匹配和方法表达式没有测试,有兴趣可以查看官网。最底下有直达链接。
2.Namespace
第一次了解namespace,是容器技术中,namespace用来做空间的隔离。
这里的namespace路由可以理解为做解析。
举个栗子:
//roouter.go 的init函数做如下更改
func init() {
ns := beego.NewNamespace("/v1",
beego.NSNamespace("/test",
beego.NSInclude(
&controllers.BasesController{},
),
),
)
......
}
#这时候想要访问上面定义的/asd就变成了如下:
jiangfeng@192 ~ curl "http://localhost:8080/v1/test/asd/id=2"
id=2%
PS:只支持NSNamespace和NSInclude解析,而且是只能两个层级
参考文档
Beego官网文档:https://beego.me/docs/mvc/controller/router.md#namespace
总结:
之前一直写的都是固定路由,看到许多大佬写路由的时候都是使用的注解路由(可能都是从java转过来的原因吧),也想更加深入了解Beego的设计思路来做的笔记。
希望自己能够坚持下去,多看多写多思考。