golang web框架设计2:自定义路由
继续学习谢大的Go web框架设计
golang web framework 框架系列文章:
- 7. golang web框架设计7:整合框架
- 6. golang web框架设计6:上下文设计
- 5. golang web框架设计5:配置设计
- 4. golang web框架设计4:日志设计
- 3. golang web框架设计3:controller设计
- 2. golang web框架设计2:自定义路由
- 1. golang web框架设计1:框架规划
HTTP路由
http路由负责将一个http的请求交到对应的函数处理(或者一个struct的方法),路由在框架中相当于一个事件处理器,而这个时间包括
- 用户请求的路径(path)(eg:/user/12, /article/1),当然还有查询信息(eg:?id=12)
- HTTP的请求方法(method)(GET,POST,PUT,DELETE,PATHC等)
路由的默认实现
Go的http包设计和实现路由,例子来说明
func fooHander(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
}
http.Handle("/", fooHandler)
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request){
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080", nil))
上面的例子调用的是http默认的DefaultServeMux来添加路由,需要提供2个参数,第一个参数是用户访问资源的URL路径,第二个参数是即将要执行的函数。所以路由思路主要就是2点:
- 添加路由信息
- 更加用户请求转发到执行的函数上
Go默认的路由添加都是通过函数http.Handle和http.HandleFunc 等来添加,底层都是调用了DefaultServeMux.Handle(pattern string, handler Handler),这个函数会把路由信息存储在一个map信息中map[string]muxEntry, 这个就解决了上面说的第一点。
Go监听端口,然后接收到tcp连接会扔给Handler来处理,上面例子用nil参数,及是用 http.DefaultServeMux,通过DefaultServeMux.ServeHTTP函数进行调度,遍历之前存储的map路由信息,和yoghurt访问的URL进行匹配,用来查询对应的注册函数,这就解决了上面所说的第二点。
Go默认路由的缺点
- 1.不支持参数设定,例如/user/:uid 这种泛型类型匹配
- 2.无法很友好的支持REST模式,无法限制访问方法,例如上面例子中,用户访问/foo,可以用GET,POST,DELETE,HEAD等方式访问
- 3.一般网站路由规则太多,编写频繁。这种路由较多的可以进一步简化,通过struct方法简化
路由设计
针对上面Go默认路由的缺点,首先要解决参数支持就要用到正则, 第二和第三个通过一种变通方法,REST的方法对应到struct的方法中,然后路由到struct而不是函数,这样路由时候就可以根据method来执行不同的方法。
存储路由
根据上面说的思路,设计2个数据类型
controllerInfo,保存路径和对于的struct,这里是一个reflect.Type类型
一个ControllerRegistor,这个是一个slice用来保存用户添加的路由信息
type controllerInfo struct {
regex *regexp.Regexp
params map[int]string
controllerType reflect.Type
}
type ControllerRegistor struct {
routers []*controllerInfo
}
初始化ControllerRegistor
func NewControllerRegistor() *ControllerRegistor {
return &ControllerRegistor{routers: make([]*controllerInfo, 0)}
}
ControllerRegistor对外的函数Add,添加url和对于的执行函数
func (p *ControllerRegistro) Add(pattern string, c ControllerInterfce)
在上面的函数中,第二个参数 ControllerInterfce 将在后面一节controller设计中讲解,它是一个interface 类型
还有一个自动路由,实现的是Go定义的函数ServeHTTP
func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request)
完整代码:
golang web框架设计2:自定义路由的更多相关文章
- golang web框架设计7:整合框架
把前面写好的路由器,控制器,日志,都整合在一起 全局变量和初始化 定义一些框架的全局变量 var ( BeeApp *App AppName string AppPath string StaticD ...
- golang web框架设计6:上下文设计
context,翻译为上下文,为什么要设计这个结构?就是把http的请求和响应,以及参数结合在一起,便于集中处理信息,以后框架的扩展等.好多框架比如gin,都是有这个上下文结构. context结构为 ...
- golang web框架设计5:配置设计
配置信息的解析,实现的是一个key=value,键值对的一个配置文件,类似于ini的配置格式,然后解析这个文件,把解析的数据保存到map中,最后调用的时候通过几个string,int之类的函数返回相应 ...
- golang web框架设计4:日志设计
beego的日志设计思路来自于seelog,根据不同的level来记录日志,beego设计的日志是一个轻量级的,采用系统log.Logger接口,默认输出到os.Stdout,用户可以实现这个接口然后 ...
- golang web框架设计3:controller设计
继续学习golang web框架设计 controller作用 MVC设计模式里面的这个C,控制器. Model是后台返回的数据: View是渲染页面,通常是HTML的模板页面: Controller ...
- golang web框架设计1:框架规划
GO WEB 编程13节,如何设计一个web框架 学习谢大的web框架设计 总体介绍 实现一个简易的web框架,我们采用mvc模式来进行开发. model:模型,代表数据结构.通常来说,模型类时包含查 ...
- 在 node.js 的 express web 框架中自动注册路由
该方法主要是动态注册自己写的 router . 注册器 router 文件名为 loader.js . var express = require('express'); var fs = requ ...
- CI 框架中的自定义路由规则
在 CI 框架中,一个 URL 和它对应的控制器中的类以及类中的方法是一一对应的,如: www.test.com/user/info/zhaoyingnan 其中 user 对应的就是控制器中的 us ...
- golang web框架 kratos中的日志框架
kratos是bilibili开源的一个web框架. 日志用法: logger.go package kratoslog import ( "flag" "github. ...
随机推荐
- TCP/UDP Socket调试工具提供了TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种Socket调试方案。
一.TCP通信测试: 1) 创建TCP Server: 选中左方的TCP Server, 然后点击”创建”按钮,软件弹出监听端口输入框 输入监听端口后,即创建了一个在指定端口上进行监听的TCP S ...
- linux bash环境变量简单总结
来源链接:http://www.178linux.com/8005 原创文章,如有转载,请注明原文地址 一.环境变量简介 Linux是一个多用户的操作系统.每个用户登录系统后,都会有一个专用的运行环境 ...
- mysql中对表操作----为所有列插入数据
为所有列插入数据 通常情况下,向数据表中插入数据应包含表中所有字段,也就是为表中所有字段添加数据,为表中所有字段添加数据有以下两种方式. 1.INSERT语句中指定所有字段名 使用INSER ...
- postgresql backup
#!/bin/sh # Database backup script # Backup use postgres pg_dump command: # pg_dump -U <user> ...
- python3爬虫系列19之反爬随机 User-Agent 和 ip代理池的使用
站长资讯平台:python3爬虫系列19之随机User-Agent 和ip代理池的使用我们前面几篇讲了爬虫增速多进程,进程池的用法之类的,爬虫速度加快呢,也会带来一些坏事. 1. 前言比如随着我们爬虫 ...
- sqlserver2014安装Windows版教程
下载好安装包,直接运行 根据自己的情况选择,我是首次安装,选择第一项即可. 之后一路下一步,然后等待安装. 安装完成
- Oracle 后台进程(六)PMON进程
一.PMON简介 二.PMON的工作内容如下: 1.监控后台进程运行状况 2.如果某些进程异常中断,PMON去释放会话资源以及占用的锁LOCK 3.更新事务表的标志以及清除事务XID的标记 4.清除异 ...
- ++a和a++不是左值
上面的编译时会出现一下错误: aplus2.c:6:6: error: lvalue required as left operand of assignmentaplus2.c:7:6: error ...
- python3实现互信息和左右熵的新词发现--基于字典树
字典树 原来讲明白了剩下的就是具体实现了,最适合存储和计算词频的数据结构就是字典树,这里给一个讲解的很清楚的链接 具体代码 代码已开源,需要的点击这个Github
- Eclipse的快捷键设置及使用
Eclipse快捷键的设置和使用 java程序开发,经常会用Eclipse或者MyEclise集成开发环境,一些实用的Eclipse快捷键和使用技巧, 可以在平常开发中节约出很多时间提高工作效率,下面 ...