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的设计思路来做的笔记。

希望自己能够坚持下去,多看多写多思考。

posted @ 2021-04-28 00:16  better_feng  阅读(558)  评论(0编辑  收藏  举报