beego | 路由系统
项目路由设置
package main import ( _ "quickstart/routers" "github.com/astaxie/beego" ) func main() { beego.Run() }
这里我们就看到了我们引入了一个包 _ "quickstart/routers"
,这个包只引入执行了里面的 init 函数
package routers import ( "quickstart/controllers" "github.com/astaxie/beego" ) func init() { beego.Router("/", &controllers.MainController{}) }
路由包里面我们看到执行了路由注册 beego.Router
, 这个函数的功能是映射 URL 到 controller,第一个参数是 URL (用户请求的地址),这里我们注册的是 /
,也就是我们访问的不带任何参数的 URL,第二个参数是对应的 Controller,也就是我们即将把请求分发到那个控制器来执行相应的逻辑,我们可以执行类似的方式注册如下路由:
beego.Router("user", &controllers.UserController{})
这样用户就可以通过访问 /user
去执行 UserController
的逻辑。
beego的路由设置
基本GET路由
beego.Get("/",func(ctx *context.Context){ ctx.Output.Body([]byte("hello world")) })
基本POST路由
beego.Post("/alice",func(ctx *context.Context){ ctx.Output.Body([]byte("bob")) })
注册一个可以响应任何HTTP的路由
beego.Any("/foo", func(ctx *context.Context){ ctx.Output.Body([]byte("bar")) })
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)
支持自定义的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
这样的也会匹配去运行
beego.Router("/", &controllers.MainController{}) beego.Router("/admin", &admin.UserController{}) beego.Router("/admin/index", &admin.ArticleController{}) beego.Router("/admin/addpkg", &admin.AddController{})
一个固定的路由, 一个控制器, 然后根据用户请求方式不同请求控制器中对应的方法,典型的RESTful方式
正则路由
为了用户更加方便的路由设置,beego 参考了 sinatra 的路由实现,支持多种方式的路由: beego.Router(“/api/?:id”, &controllers.RController{}) 默认匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123” beego.Router(“/api/:id”, &controllers.RController{}) 默认匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”,但URL”/api/“匹配失败 beego.Router(“/api/:id([0-9]+)“, &controllers.RController{}) 自定义正则匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123” beego.Router(“/user/:username([\\w]+)“, &controllers.RController{}) 正则字符串匹配 //例如对于URL”/user/astaxie”可以匹配成功,此时变量”:username”值为”astaxie” beego.Router(“/download/*.*”, &controllers.RController{}) *匹配方式 //例如对于URL”/download/file/api.xml”可以匹配成功,此时变量”:path”值为”file/api”, “:ext”值为”xml” beego.Router(“/download/ceshi/*“, &controllers.RController{}) *全匹配方式 //例如对于URL”/download/ceshi/file/api.json”可以匹配成功,此时变量”:splat”值为”file/api.json” beego.Router(“/:id:int”, &controllers.RController{}) int 类型设置方式,匹配 :id为int 类型,框架帮你实现了正则 ([0-9]+) beego.Router(“/:hi:string”, &controllers.RController{}) string 类型设置方式,匹配 :hi 为 string 类型。框架帮你实现了正则 ([\w]+) beego.Router(“/cms_:id([0-9]+).html”, &controllers.CmsController{}) 带有前缀的自定义正则 //匹配 :id 为正则类型。匹配 cms_123.html 这样的 url :id = 123
可以在Controller中通过如下方式获取上面的变量
this.Ctx.Input.Param(":id") this.Ctx.Input.Param(":username") this.Ctx.Input.Param(":splat")
自定义方法以及RESTful规则
上面列举的是默认的请求方法名(请求的 method 和函数名一致,例如 GET
请求执行 Get
函数,POST
请求执行 Post
函数),如果用户期望自定义函数名,那么可以使用如下方式:
beego.Router("/", &IndexController{}, "*:Index")
* 表示任意的method都执行该函数
使用httpmethod:funcname
多个不同的格式使用;分割
多个method对应同一个funcname,method之间通过,来分割
beego.Router("/api/list", &RestController{}, "*:ListFood") beego.Router("/api/create", &RestController{}, "post: CreateFood")
多个HTTP Method指向同一个函数的指示
beego.Router("/api", &RestController{}, "get, post:ApiFunc")
通过;进行分割
beego.Router("/simple", &simpleController{}, "get: GetFunc; post: PostFunc")
如果同时存在 * 和对应的 HTTP Method,那么优先执行 HTTP Method 的方法,例如同时注册了如下所示的路由:
beego.Router("/simple",&SimpleController{},"*:AllFunc;post:PostFunc")
注意: 自定义函数的路由默认不支持 RESTful 的方法,也就是如果你设置了 beego.Router("/api",&RestController{},"post:ApiFunc")
这样的路由,如果请求的方法是 POST
,那么不会默认去执行 Post
函数。
自动匹配
beego.AutoRouter(&controllers.ObjectController{})
那么 beego 就会通过反射获取该结构体中所有的实现方法,你就可以通过如下的方式访问到对应的方法中
详细查看官方文档:https://beego.me/docs/mvc/controller/router.md