当前位置: 首页 > wzjs >正文

齐河建设局网站网易企业邮箱下载官网

齐河建设局网站,网易企业邮箱下载官网,建立企业网站收费标准,电子商务网站费用Day4:分组控制 今天的任务是: 实现路由分组控制(Route Group Control),代码约 50 行。 分组的意义 分组控制(Group Control)是 Web 框架应提供的基础功能之一。分组指的是路由的分组&#…

Day4:分组控制

今天的任务是:

  • 实现路由分组控制(Route Group Control),代码约 50 行。
    请添加图片描述

分组的意义

分组控制(Group Control)是 Web 框架应提供的基础功能之一。分组指的是路由的分组,如果没有路由分组,我们需要针对每一个路由进行控制。但在真实的业务场景下,往往某一组路由需要相似的处理。例如:

  • /post开头的路由匿名可访问;
  • /admin开头的路由需要鉴权;
  • /api开头的路由是 RESTful 接口,可以对接第三方平台,需要三方平台鉴权。

大部分情况下的路由分组是以相同的前缀来区分的。因此,今天我们要实现的分组控制也是以前缀来区分的,并且支持分组嵌套。例如/post是一个分组,而/post/a/post/b是该分组的子分组。作用在/post分组上的中间件,也都会作用在子分组,子分组还应该支持自己特有的中间件。

中间件可以给框架提供无限的拓展能力,应用在分组上,可以使得分组控制的收益更加明显,而不是共享相同的路由前缀这么简单。例如 /admin 分组可以应用鉴权中间件;/分组应用日志中间件(/是最顶层的分组)。

分组嵌套

一个 Group 对象需要具备哪些属性呢?首先是前缀 prefix,比如//api。要支持分组嵌套,必须知道当前分组的父亲(parent)是谁。按照我们最初的分析,中间件是应用在分组上的,所以我们还应该存储应用在分组上的中间件(middlewares)。在之前,我们应用(*Engine).addRoute()来映射所有的路由规则和 Handler。如果 Group 对象需要直接映射路由规则的话,比如我们想在使用框架时,按照如下方式调用:

r := gee.New()
v1 := r.Group("/v1")
v1.GET("/", func(c *gee.Context){c.HTML(http.StatusOK, "<h1>Hello Gee</h1>")
})

那么 Group 对象还需要具有访问 Router 的能力。为了方便,我们可以在 Group 种保存一个指向 Engine 的指针,整个框架所有的资源都是由 Engine 统一协调的,可以通过 Engine 间接地访问各种接口。

最终,Group 的定义如下:

// in gee/gee.gotype RouterGroup struct {prefix      stringmiddlewares []HandlerFunc // support middlewareparent      *RouterGroup  // support nestingengine      *Engine       // all groups share an Engine instance
}

我们可以进一步地抽象,将 Engine 作为顶层的分组,也就是 Engine 具有 RouterGroup 的所有能力:

type Engine struct {*RouterGroup // embed a RouterGroup pointerrouter       *routergroups       []*RouterGroup
}

至此,我们可以将所有与路由相关的函数,都交给RouterGroup来处理了。

func New() *Engine {engine := &Engine{router: newRouter()}engine.RouterGroup = &RouterGroup{engine: engine}engine.groups = []*RouterGroup{engine.RouterGroup}return engine
}func (group *RouterGroup) Group(prefix string) *RouterGroup {engine := group.enginenewGroup := &RouterGroup{prefix: group.prefix + prefix,parent: group,engine: engine,}engine.groups = append(engine.groups, newGroup)return newGroup
}// addRoute combines method and pattern together and then add method-pattern and handler to map
func (group *RouterGroup) addRoute(method, comp string, handler HandlerFunc) {pattern := group.prefix + complog.Printf("Route %4s - %s", method, pattern)group.engine.router.addRoute(method, pattern, handler)
}// GET defines the method to add GET request
func (group *RouterGroup) GET(pattern string, handler HandlerFunc) {group.addRoute("GET", pattern, handler)
}// POST defines the method to add POST request
func (group *RouterGroup) POST(pattern string, handler HandlerFunc) {group.addRoute("POST", pattern, handler)
}

仔细观察 addRoute 函数,它调用 group.engine.router.addRoute 来实现了路由的映射。由于Engine某种意义上继承了RouterGroup的所有属性和方法,因为(*Engine).engine是指向自己的。这样实现,我们既可以像原来一样添加路由,也可以通过分组添加路由。

Demo

测试框架的 Demo 如下:

package mainimport ("gee/gee""net/http"
)func main() {r := gee.New()r.GET("/index", func(c *gee.Context) {c.HTML(http.StatusOK, "<h1>Index Page</h1>")})v1 := r.Group("/v1"){v1.GET("/", func(c *gee.Context) {c.HTML(http.StatusOK, "<h1>Hello Gee</h1>")})v1.GET("/hello", func(c *gee.Context) {// expect /hello?name=geektutuc.String(http.StatusOK, "hello %s, you're at %s\n", c.Query("name"), c.Path)})}v2 := r.Group("/v2"){v2.GET("/hello/:name", func(c *gee.Context) {// expect /hello/geektutuc.String(http.StatusOK, "hello %s, you're at %s\n", c.Param("name"), c.Path)})v2.POST("/login", func(c *gee.Context) {c.JSON(http.StatusOK, gee.H{"username": c.PostForm("username"),"password": c.PostForm("password"),})})}r.Run(":9999")
}

文章转载自:

http://UFw4kJyz.hmfxL.cn
http://P2tAyqse.hmfxL.cn
http://50OQ8rtg.hmfxL.cn
http://MuaKt6En.hmfxL.cn
http://F3ExSTEi.hmfxL.cn
http://NErqJ4k8.hmfxL.cn
http://XowXogh2.hmfxL.cn
http://E0yKMsXK.hmfxL.cn
http://4rq0EzBq.hmfxL.cn
http://cXmU2Hfp.hmfxL.cn
http://ekm0USbO.hmfxL.cn
http://nOOCuDix.hmfxL.cn
http://WrxSblbK.hmfxL.cn
http://Uz5SlZha.hmfxL.cn
http://75AAR8yC.hmfxL.cn
http://DVI4g2F7.hmfxL.cn
http://4HwjH64V.hmfxL.cn
http://gjPY0j0F.hmfxL.cn
http://nJcbCt7H.hmfxL.cn
http://fDFX1CHV.hmfxL.cn
http://xz4JsZKx.hmfxL.cn
http://Y2ZpGsxk.hmfxL.cn
http://IE0hnfPF.hmfxL.cn
http://8cpNk8sF.hmfxL.cn
http://Hg5kVLo3.hmfxL.cn
http://bHWhNxzK.hmfxL.cn
http://eBlhIErx.hmfxL.cn
http://xJKHdQgU.hmfxL.cn
http://duT5d80W.hmfxL.cn
http://ngfOdtjO.hmfxL.cn
http://www.dtcms.com/wzjs/752425.html

相关文章:

  • 中建南方建设集团网站wordpress我的世界主题
  • 网站建设机器人做美容美发学校网站公司
  • 做外贸网站的都有哪些类型的公司上海门户网站怎么登录
  • 重庆建网站价格表豪华跑车网站建设
  • 旅游网站设计背景太原网站建设工作室
  • 做产品的往这看 国外工业设计网站大全网站被入侵
  • 阜阳做网站的公司微信官网电脑版下载
  • 做名片用哪个网站桦南县建设局网站
  • 网站安装源码产品推广文案
  • 想用wordpress建立网站网站的作用有哪些
  • 有谁可以做网站寄生虫云南建设工程招投标信息网
  • 百度seo站长展示设计作品欣赏
  • 漯河住房和城乡建设局网站asp网站建设外文参考文献
  • 专业建设网站公司哪家好公司网站建设的目的
  • 网站开发框架专业的昆明网站建设
  • 网站的关键词报价的网站想做网络推广的公司
  • 网站推广的六种方式泰安网络软件公司
  • 做评测系统网站首先要干嘛百度软件
  • 如何用手机建网站郑州商务网站建设
  • 做网站网页排版错误大连专业手机自适应网站制作
  • 如果建设一个网站上海网站建设网站开发
  • 电脑店免费建站访问国外网站太慢
  • 电子商务公司网站建立前期准备wordpress如何导出数据
  • 石家庄做网站排名网站改版 翻译
  • 大型网站建设的价格织梦可以做视频网站么
  • 做百度网上搜索引擎推广最好网站网站ping怎么做
  • 各大网站网络推广的收费wordpress所有外链本地化
  • iis装网站山东德州如何网站建设教程
  • 温州网站链接怎么做邀请码网站怎么做
  • 网站主页布局益阳网页设计