zoukankan      html  css  js  c++  java
  • Beego路由设置

    1.路由设置

    Beego支持的路由的方式:

    ​ 固定路由、正则路由和自动路由。

    1.1固定路由

    ​ 介绍:完全匹配的路由,只有你请求的url匹配到了对应的路由,才会找对应的函数。

    一个简单的例子:

    //在controllers中定义
    type MainController struct {
    	beego.Controller
    }
    
    func (this *MainController) Get(){
    	this.Data["json"]= "Hello World"
    	this.ServeJSON()
    }
    
    //在Router.go中添加
    func init() {
      ···
      	beego.Router("/", &controllers.MainController{})
      ···
    }
    

    这个时候我们请求/目录就会返回 Helllo World

    jiangfeng@192 � ~ � curl "http://localhost:8080/"
    "Hello World"%
    

    一个自定义方法的例子:

    //在controllers中定义
    func (this *MainController) Hehe(){
    	this.Data["json"]= "Hehe"
    	this.ServeJSON()
    }
    
    //router.go 文件中添加如下:
    beego.Router("/admin/", &controllers.MainController{}, "get:Hehe")
    
    

    1.2正则路由

    ​ 介绍:路由中添加了正则表达式,可以更方便的做匹配。

    一个简单的例子:

    //复用了Get()函数
    //在router.go中添加如下代码
    	beego.Router("/api/:id", &controllers.MainController{})
    

    这个时候,单请求/api是无法找到正确的路由的,必须携带id信息才可以

    jiangfeng@192 � ~ � curl -I "http://localhost:8080/api/"
    HTTP/1.1 404 Not Found
    Server: beegoServer:2.0.0
    Date: Tue, 27 Apr 2021 15:32:45 GMT
    Content-Length: 2000
    Content-Type: text/html; charset=utf-8
    
     jiangfeng@192 � ~ � curl "http://localhost:8080/api/id=1"
    "Hello World"
    

    1.3自动匹配(注解路由)

    ​ 介绍:不需要频繁的在router.go文件中定义,在控制器函数上行使用代码标注就好。beego默认会在router目录下创建一个commentsRouter_controllers.go文件,这里生成好了路由信息。

    举个栗子:

    //Controllers 中定义函数
    type BasesController struct {
    	beego.Controller
    }
    
    // @router /asd/?:id [get]
    func (this *BasesController) Asd() {
    	this.Ctx.WriteString(this.Ctx.Input.Param(":id"))
    }
    
    
    //在router.go中注册路由:
    	beego.Include(&controllers.BasesController{})
    

    ps:

    • BaseControllers 不能使用,一使用就报错,可能Beego有内部使用吧,没有仔细看过源码
    • @router 这一行是必填项,用来做标识。
    • 注意只会在 dev 模式下进行生成,生成的路由放在 “/routers/commentsRouter.go” 文件中。

    关于官网介绍的URLMapping 函数,本人测试不注册的情况下,没有找到控制器的。但是速度测试是有提高的,如果为了提高效率,还是可以添加的。
    官网介绍:

    同时大家注意到新版本里面增加了 URLMapping 这个函数,这是新增加的函数,用户如果没有进行注册,那么就会通过反射来执行对应的函数,如果注册了就会通过 interface 来进行执行函数,性能上面会提升很多。
    
    //例子:
    func (c *CMSController) URLMapping() {
        c.Mapping("StaticBlock", c.StaticBlock)
        c.Mapping("AllBlock", c.AllBlock)
    }
    

    自动匹配和方法表达式没有测试,有兴趣可以查看官网。最底下有直达链接。

    2.Namespace

    ​ 第一次了解namespace,是容器技术中,namespace用来做空间的隔离。
    ​ 这里的namespace路由可以理解为做解析。

    举个栗子:

    //roouter.go 的init函数做如下更改
    func init() {
    	ns := beego.NewNamespace("/v1",
    		beego.NSNamespace("/test",
    			beego.NSInclude(
    				&controllers.BasesController{},
    			),
    		),
    	)
      ......
    }
    
    #这时候想要访问上面定义的/asd就变成了如下:
    jiangfeng@192 � ~ � curl "http://localhost:8080/v1/test/asd/id=2"
    id=2%
    

    PS:只支持NSNamespace和NSInclude解析,而且是只能两个层级

    参考文档

    Beego官网文档:https://beego.me/docs/mvc/controller/router.md#namespace

    总结:

    之前一直写的都是固定路由,看到许多大佬写路由的时候都是使用的注解路由(可能都是从java转过来的原因吧),也想更加深入了解Beego的设计思路来做的笔记。

    希望自己能够坚持下去,多看多写多思考。

  • 相关阅读:
    PythonStudy——greenlet 协程
    PythonStudy——事件 Event
    PythonStudy——单线程并发的实现
    2015年的总结
    kylin一种OLAP的实现
    分布式消息队列的使用kakfa
    第一次听到了docker
    Hive分布式的数据仓库
    dubbo服务框架学习
    Storm实时计算框架的编程模式
  • 原文地址:https://www.cnblogs.com/feng0919/p/14711528.html
Copyright © 2011-2022 走看看