前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang 语言 beego v2 之路由设置

Golang 语言 beego v2 之路由设置

作者头像
frank.
发布2020-12-08 14:49:46
2.2K1
发布2020-12-08 14:49:46
举报

01

介绍

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

02

RESTful Controller 路由

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

固定路由:

代码语言:javascript
复制
beego.Router("/", &controllers.MainController{})
beego.Router("/user", &controllers.UserController{})

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

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

正则路由:

代码语言:javascript
复制
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 匹配。

自动路由:

代码语言:javascript
复制
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 的函数。

代码语言:javascript
复制
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:

代码语言:javascript
复制
beego.Include(&controller@UserController)

controller 的方法上写上 router 注释:

代码语言:javascript
复制
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,它非常强大,我们通过区分接口版本号演示它的使用方法。

代码语言:javascript
复制
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 和闭包函数组成的路由。

代码语言:javascript
复制
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

路由参数

路由参数:

代码语言:javascript
复制
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 的用法。

bug list:

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档