Golang 语言 beego v2 之路由设置

简介: Golang 语言 beego v2 之路由设置

01

介绍


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


02

RESTful Controller 路由


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


固定路由:


beego.Router("/", &controllers.MainController{})
beego.Router("/user", &controllers.UserController{})


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


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


正则路由:


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 匹配。


自动路由:


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 的函数。


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:


beego.Include(&controller@UserController)


controller 的方法上写上 router 注释:


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


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 和闭包函数组成的路由。


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

路由参数


路由参数:


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 的用法。





目录
相关文章
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
144 4
Golang语言之管道channel快速入门篇
|
3月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
72 4
Golang语言文件操作快速入门篇
|
3月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
118 3
Golang语言之gRPC程序设计示例
|
3月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
101 4
|
3月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
78 4
Golang语言goroutine协程篇
|
3月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
80 3
Golang语言之Prometheus的日志模块使用案例
|
2月前
|
前端开发 中间件 Go
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
38 0
|
3月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
55 3
|
3月前
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
74 3
Golang语言之函数(func)进阶篇
|
3月前
|
Go
Golang语言之函数(func)基础篇
这篇文章深入讲解了Golang语言中函数的定义和使用,包括函数的引入原因、使用细节、定义语法,并通过多个案例展示了如何定义不返回任何参数、返回一个或多个参数、返回值命名、可变参数的函数,同时探讨了函数默认值传递、指针传递、函数作为变量和参数、自定义数据类型以及返回值为切片类型的函数。
87 2
Golang语言之函数(func)基础篇