李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
05.Beego路由配置
Leefs
2022-07-31 PM
1134℃
0条
[TOC] ### 前言 beego存在三种方式的路由:固定路由、正则路由、自动路由,接下来详细的讲解如何使用这三种路由。 ### 一、基本路由 该方式相当于直接将一个url路由和一个函数绑定起来。 **示例一** ```go package routers import ( "github.com/astaxie/beego" "github.com/astaxie/beego/context" ) func init() { //将请求url和一个闭包函数绑定起来, 这个url的Get请求由这个闭包函数处理。 beego.Get("/base1",func(ctx *context.Context){ ctx.Output.Body([]byte("hello world")) }) } ``` + **通过请求输出结果** ![05.Beego路由配置01.jpg](https://lilinchao.com/usr/uploads/2022/07/3552708642.jpg) **示例二** ```go package routers import ( "github.com/astaxie/beego" "github.com/astaxie/beego/context" ) func init() { //将url /base2 和Index函数绑定起来,由Index函数处理这个url的Post请求 beego.Post("/base2", Index) } // 定义一个处理函数 func Index(ctx *context.Context){ ctx.Output.Body([]byte("欢迎来到李林超博客!")) } ``` + **通过请求输出结果** ![05.Beego路由配置02.jpg](https://lilinchao.com/usr/uploads/2022/07/1231501295.jpg) **下面是beego支持的基础函数:** - 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) - 处理任意http请求,就是不论请求方法(Get,Post,Delete等等)是什么,都由绑定的函数处理 根据不同的http请求方法(Get,Post等等)选择不同的函数设置路由即可。 ### 二、固定路由 固定路由也就是全匹配的路由,如下所示: ```go beego.Router("/", &controllers.MainController{}) beego.Router("/admin", &admin.UserController{}) beego.Router("/admin/index", &admin.ArticleController{}) beego.Router("/admin/addpkg", &admin.AddController{}) ``` 如上所示的路由就是最常用的路由方式,一个固定的路由,一个控制器,然后根据用户请求方法不同请求控制器中对应的方法,典型的 RESTful方式。 > RESTful 是一种目前 API 开发中广泛采用的形式,beego 默认就是支持这样的请求方法,也就是用户 Get 请求就执行 Get 方法,Post 请求就执行 Post 方法。因此默认的路由是这样 RESTful 的请求方式。 ### 三、正则路由 为了用户更加方便的路由设置,beego 参考了 sinatra 的路由实现,支持多种方式的路由: + **示例一** ```go beego.Router("/api/?:id", &controllers.RController{}) ``` 默认匹配 `//`例如对于URL`"/api/123"`可以匹配成功,此时变量”:id”值为”123”。URL”/api/“可正常匹配 `?`:表示该参数可以忽略,非必传项。 + **示例二** ```go beego.Router("/api/:id", &controllers.RController{}) ``` 默认匹配 `//`例如对于URL`"/api/123"`可以匹配成功,此时变量”:id”值为”123”。但URL”/api/“匹配失败,因为id值为必传项。 + **示例三** ```go beego.Router("/api/:id([0-9]+)", &controllers.RController{}) ``` 自定义正则匹配 `//`例如对于URL`"/api/123"`可以匹配成功,此时变量”:id”值为”123” + **示例四** ```go beego.Router("/user/:username([\\w]+)", &controllers.RController{}) ``` 正则字符串匹配 `//`例如对于URL`"/user/leefs"`可以匹配成功,此时变量”:username”值为”leefs” + **示例五** ```go beego.Router("/download/*.*", &controllers.RController{}) ``` `*`匹配方式 `//`例如对于URL`"/download/file/api.xml"`可以匹配成功,此时变量”:path”值为`”file/api”`, “:ext”值为”xml” + **示例六** ```go beego.Router("/download/ceshi/*", &controllers.RController{}) ``` `*`全匹配方式 `//`例如对于URL`"/download/ceshi/file/api.json"`可以匹配成功,此时变量”:splat”值为”file/api.json” + **示例七** ```go beego.Router("/:id:int", &controllers.RController{}) ``` int 类型设置方式,匹配 :id为int 类型,框架帮你实现了正则 ([0-9]+) + **示例八** ```go beego.Router("/:hi:string", &controllers.RController{}) ``` string 类型设置方式,匹配 :hi 为 string 类型。框架帮你实现了正则 ([\w]+) + **示例九** ```go beego.Router("/cms_:id([0-9]+).html", &controllers.CmsController{}) ``` 带有前缀的自定义正则 `//`匹配 :id 为正则类型。匹配 cms_123.html 这样的 url :id = 123 **可以在 Controller 中通过如下方式获取上面的变量:** ```go package controllers import ( "github.com/astaxie/beego" ) type MainController struct { beego.Controller } func (c *MainController) Get() { c.Ctx.Input.Param(":id") c.Ctx.Input.Param(":username") c.Ctx.Input.Param(":splat") c.Ctx.Input.Param(":path") c.Ctx.Input.Param(":ext") } ``` ### 四、自定义方法及 RESTful 规则 上面列举的是默认的请求方法名(请求的 method 和函数名一致,例如 `GET` 请求执行 `Get` 函数,`POST` 请求执行 `Post` 函数),如果用户期望自定义函数名,那么可以使用如下方式: ```go beego.Router("/",&IndexController{},"*:Index") ``` 使用第三个参数,第三个参数就是用来设置对应 method 到函数名。 **定义如下:** - `*`表示任意的 method 都执行该函数 - 使用 httpmethod:funcname 格式来展示 - 多个不同的格式使用 `;` 分割 - 多个 method 对应同一个 funcname,method 之间通过 `,` 来分割 **示例** + **RESTful 的设计示例** ```go beego.Router("/api/food",&RestController{},"get:ListFood") beego.Router("/api/food",&RestController{},"post:CreateFood") beego.Router("/api/food",&RestController{},"put:UpdateFood") beego.Router("/api/food",&RestController{},"delete:DeleteFood") ``` + **多个HTTP Method指向同一个函数的示例** ```go beego.Router("/api",&RestController{},"get,post:ApiFunc") ``` + **不同的 method 对应不同的函数,通过 ; 进行分割的示例** ```go beego.Router("/api/food",&RestController{},"get:ListFood;post:CreateFood;put:UpdateFood;delete:DeleteFood") ``` **可用的 HTTP Method** - `*`: 包含以下所有的函数 - **get**: GET 请求 - **post**: POST 请求 - **put**: PUT 请求 - **delete**: DELETE 请求 - **patch**: PATCH 请求 - **options**: OPTIONS 请求 - **head**: HEAD 请求 如果同时存在 `*` 和对应的 HTTP Method,那么优先执行 HTTP Method 的方法。 **例如同时注册了如下所示的路由:** ```go beego.Router("/simple",&SimpleController{},"*:AllFunc;post:PostFunc") ``` 那么执行 `POST` 请求的时候,执行 `PostFunc` 而不执行 `AllFunc`。 > 自定义函数的路由默认不支持 RESTful 的方法,也就是如果你设置了 beego.Router("/api",&RestController{},"post:ApiFunc") 这样的路由,如果请求的方法是 POST,那么不会默认去执行 Post 函数。 ### 五、自动匹配 用户首先需要把需要路由的控制器注册到自动路由中: ```go beego.AutoRouter(&controllers.ObjectController{}) ``` 那么 beego 就会通过反射获取该结构体中所有的实现方法,你就可以通过如下的方式访问到对应的方法中: ```go /object/login 调用 ObjectController 中的 Login 方法 /object/logout 调用 ObjectController 中的 Logout 方法 ``` 除了前缀两个 `/:controller/:method` 的匹配之外,剩下的 url beego 会帮你自动化解析为参数,保存在 `this.Ctx.Input.Params` 当中: ``` /object/blog/2022/08/01 调用 ObjectController 中的 Blog 方法,参数如下:map[0:2022 1:08 2:01] ``` 方法名在内部是保存了用户设置的,例如 Login,url 匹配的时候都会转化为小写,所以,`/object/LOGIN` 这样的 `url` 也一样可以路由到用户定义的 `Login` 方法中【实际在1.10.1版本中测试,不会转化大小写,即只能匹配`/object/login`,其他均不能正常识别】。 现在已经可以通过自动识别出来下面类似的所有 url,都会把请求分发到 `controller` 的 `simple` 方法: ``` /controller/simple /controller/simple.html /controller/simple.json /controller/simple.xml ``` 可以通过 `this.Ctx.Input.Param(":ext")` 获取后缀名。 *附参考原文链接地址* *https://www.bookstack.cn/read/beego-2.0-zh/mvc-controller-router.md*
标签:
Beego
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/2287.html
上一篇
04.Beego框架参数配置
下一篇
06.Beego框架控制器函数
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Kibana
Git
Scala
正则表达式
Livy
Eclipse
算法
哈希表
Spark RDD
Hbase
随笔
并发编程
Docker
序列化和反序列化
Netty
Spring
GET和POST
Stream流
Tomcat
人工智能
HDFS
Sentinel
链表
NIO
DataWarehouse
二叉树
Spark
散列
线程池
ajax
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞