李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
05.Beego路由配置
Leefs
2022-07-31 PM
1766℃
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://lilinchao.com/archives/2287.html
上一篇
04.Beego框架参数配置
下一篇
06.Beego框架控制器函数
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
JavaScript
SpringBoot
机器学习
SpringCloud
DataWarehouse
Hive
gorm
Eclipse
Spring
JavaWEB项目搭建
RSA加解密
CentOS
Flume
SpringCloudAlibaba
Redis
随笔
算法
二叉树
锁
MyBatisX
Flink
Shiro
FileBeat
JavaSE
线程池
前端
Spark SQL
FastDFS
JVM
设计模式
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭