u如何设置url参数不自动转码_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 的用法。


1f09c51e61623a90e6338b2834a71f94.png

bug list:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值