Documentation ¶
Index ¶
- Variables
- func TypeIdOf(v interface{}) uint
- type Context
- type Filter
- type FilterBuilder
- type FilterFunc
- type Handler
- type Node
- type NodeBuilder
- type Params
- type ParamsFunc
- type ParamsReceiver
- type PathParams
- type ResponseWriteFakeFlusher
- func (rw *ResponseWriteFakeFlusher) Flush()
- func (rw *ResponseWriteFakeFlusher) Size() int
- func (rw *ResponseWriteFakeFlusher) Status() int
- func (rw *ResponseWriteFakeFlusher) Write(b []byte) (int, error)
- func (rw *ResponseWriteFakeFlusher) WriteHeader(s int)
- func (rw *ResponseWriteFakeFlusher) Written() bool
- type ResponseWriter
- type Rivet
- func (r *Rivet) Get(t uint) (v interface{})
- func (c *Rivet) GetParams() Params
- func (c *Rivet) GetPathParams() PathParams
- func (c *Rivet) Handlers(handler ...interface{})
- func (c *Rivet) Invoke(handler interface{}) bool
- func (r *Rivet) Map(v interface{})
- func (r *Rivet) MapTo(v interface{}, t uint)
- func (c *Rivet) Next()
- func (c *Rivet) ParamsReceiver(name, text string, val interface{})
- func (c *Rivet) Request() *http.Request
- func (c *Rivet) Response() http.ResponseWriter
- func (c *Rivet) WriteString(data string) (int, error)
- type Riveter
- type Router
- func (r *Router) Any(pattern string, handler ...interface{}) Node
- func (r *Router) Delete(pattern string, handler ...interface{}) Node
- func (r *Router) Get(pattern string, handler ...interface{}) Node
- func (r *Router) Handle(method string, pattern string, h ...interface{}) Node
- func (r *Router) Head(pattern string, handler ...interface{}) Node
- func (r *Router) Match(method, urlPath string, rec ParamsReceiver, rw http.ResponseWriter, ...) Node
- func (r *Router) NodeBuilder(nb NodeBuilder)
- func (r *Router) NotFound(h ...interface{}) Node
- func (r *Router) Options(pattern string, handler ...interface{}) Node
- func (r *Router) Patch(pattern string, handler ...interface{}) Node
- func (r *Router) Post(pattern string, handler ...interface{}) Node
- func (r *Router) Put(pattern string, handler ...interface{}) Node
- func (r *Router) RootTrie(method string) *Trie
- func (r *Router) ServeHTTP(rw http.ResponseWriter, req *http.Request)
- type Scene
- type Trie
- func (t *Trie) Add(path string, newFilter FilterBuilder) *Trie
- func (p Trie) Filter(text string, rw http.ResponseWriter, req *http.Request) (string, interface{}, bool)
- func (t *Trie) GetId() int
- func (t *Trie) Match(path string, rec ParamsReceiver, rw http.ResponseWriter, req *http.Request) *Trie
- func (t *Trie) Print(prefix string) (count int)
- func (t *Trie) SetId(id int)
Constants ¶
This section is empty.
Variables ¶
var FilterClass = map[string]FilterBuilder{
"": builtinFilter,
"*": builtinFilter,
"string": builtinFilter,
"alpha": builtinFilter,
"alnum": builtinFilter,
"hex": builtinFilter,
"uint": builtinFilter,
"|": builtinFilter,
}
* FilterClass 保存 Fliter 生成器, 使用者可注册新的生成器.
内建 class 列表:
空, 占位 class. * Unicode characters, 允许空值, 等同于: ": *", 占位 class. string 非空 Unicode characters, 缺省值, 如果没有参数可省略. alpha [a-zA-Z]+ alnum [a-zA-Z]+[0-9]+ hex [a-z0-9]+ uint uint 可以使用 strconv.ParseUint 的 bitSize 参数 | 正则, 样例: ":id | ^id([0-9]+)$". 用 FindStringSubmatch 提取最后一个 Submatch.
其中: string, alpha, alnum, hex 可以加一个长度限制参数, 如:
":name string 10" 限制参数字符串字节长度不超过 10.
Functions ¶
func TypeIdOf ¶
func TypeIdOf(v interface{}) uint
* TypeIdOf 返回 v 的类型签名地址, 转换为 uint 类型. 内部使用 reflect 获取类型地址.
示例: 获取 fmt.Stringer 接口类型签名:
var v *fmt.Stringer _ = TypeIdOf(v) // 或者 _ = TypeIdOf((*fmt.Stringer)(nil))
获取 reflect.Type 本身的类型签名:
var rt *reflect.Type _ = TypeIdOf(rt) // reflect.Type 也是接口类型 // 或者 t := reflect.TypeOf(nil) _ = TypeIdOf(&t)
获取函数的参数类型签名:
t := reflect.TypeOf(fmt.Println) _ = TypeIdOf(t.In(0))
非接口类型:
var s string _ = TypeIdOf(s) // 等同 TypeIdOf("") var v AnyNotInterfaceType _ = TypeIdOf(v)
Types ¶
type Context ¶
type Context interface { // Context 要实现参数接收器. ParamsReceiver // Request 返回生成 Context 的 *http.Request. Request() *http.Request // Response 返回生成 Context 的 http.ResponseWriter. Response() http.ResponseWriter // WriteString 向 http.ResponseWriter 写入 data. WriteString(data string) (int, error) // GetParams 返回路由匹配时从 URL.Path 中提取的参数. GetParams() Params /** PathParams 返回路由匹配时从 URL.Path 中提取的原始参数. 需要与 Scene/NewScene 配套使用. */ GetPathParams() PathParams // Handlers 设置 Handler, 通常这只能使用一次 Handlers(handler ...interface{}) /** Invoke 处理 handler, 如果无法调用, 关联到 context. 如果 handler 可被调用, 但是无法获取其参数, 返回 false. 否则返回 true. */ Invoke(handler interface{}) bool // Next 遍历 Handlers 保存的 handler, 通过 Invoke 调用. Next() // Map 等同 MapTo(v, TypeIdOf(v)) Map(v interface{}) /** MapTo 以 t 为 key 把变量 v 关联到 context. 相同 t 值只保留一个. */ MapTo(v interface{}, t uint) /** Get 以类型标识 t 为 key, 获取关联到 context 的变量. 如果未找到, 返回 nil. */ Get(t uint) interface{} }
* Context 是 Request 上下文, 主要负责关联变量并调用 Handler. 事实上 Context 采用 All-In-One 的设计方式, 具体实现不必未完成所有接口, 使用方法配套即可.
func NewContext ¶
func NewContext(res http.ResponseWriter, req *http.Request) Context
NewContext 新建 *Rivet 实例实现的 Context.
type Filter ¶
type Filter interface { /** Filter 参数 text 举例: 有路由规则 "/blog/cat:id num 6". 实例 URL.Path "/blog/cat3282" 需要过滤. text 参数值是字符串 "3282". 参数 rw, req: Filter 可能需要 req 的信息, 甚至直接写 rw. 返回值: string 通过检查提取的字符串值. interface{} 通过检查/转换后的数据. bool 值表示是否通过过滤器. */ Filter(text string, rw http.ResponseWriter, req *http.Request) (string, interface{}, bool) }
* Filter 检验, 转换 URL.Path 参数, 亦可过滤 http.Request.
type FilterFunc ¶
* FilterFunc 包装函数符合 Filter 接口.
func (FilterFunc) Filter ¶
func (filter FilterFunc) Filter(text string, _ http.ResponseWriter, _ *http.Request) (string, interface{}, bool)
type Node ¶
type Node interface { /** Riveter 设置 Riveter. 此方法让 Node 可以拥有单独 Context. */ Riveter(riveter Riveter) /** Handlers 设置路由 Handler. */ Handlers(handler ...interface{}) /** Apply 调用 Context 的 Handlers 和 Next 方法. 如果设置了 Riveter, 可使用生成独立的 Context. */ Apply(context Context) /** Id 返回 Node 的识别 id, 0 表示 NotFound 节点. 此值由 NodeBuilder 确定. */ Id() int }
* Node 保存路由 Handler, 并调用 Context 的 Handlers 和 Next 方法.
type Params ¶
type Params map[string]interface{}
* Params 存储从 URL.Path 中提取的参数. 值可能经过 Filter 转换.
func (Params) ParamsReceiver ¶
ParamsReceiver 逐个接受从 URL.Path 中提取的参数.
type ParamsFunc ¶
type ParamsFunc func(key, text string, val interface{})
* ParamsFunc 包装函数符合 ParamsReceiver 接口.
func (ParamsFunc) ParamsReceiver ¶
func (rec ParamsFunc) ParamsReceiver(key, text string, val interface{})
type ParamsReceiver ¶
type ParamsReceiver interface { /** ParamsReceiver 逐个接受参数. 参数: name 参数名, "*" 代表 catch-All 模式的名字 text URL.Path 中的原始值. val 经 Filter 处理后的值. */ ParamsReceiver(name, text string, val interface{}) }
* ParamsReceiver 接收从 URL.Path 中提取的参数.
type PathParams ¶
* PathParams 存储从 URL.Path 中提取的原始参数. 与 Scene/NewScene 配套使用.
func (PathParams) ParamsReceiver ¶
func (p PathParams) ParamsReceiver(key, text string, _ interface{})
ParamsReceiver 逐个接受从 URL.Path 中提取的原始参数.
type ResponseWriteFakeFlusher ¶
type ResponseWriteFakeFlusher struct { http.ResponseWriter // contains filtered or unexported fields }
* ResponseWriteFakeFlusher 实现了 http.ResponseWriter 接口和伪 http.Flusher 接口. Flush() 是个方法, 是否支持 Flusher 取决于原 http.ResponseWriter 实例.
func (*ResponseWriteFakeFlusher) Flush ¶
func (rw *ResponseWriteFakeFlusher) Flush()
Flush() 是个伪方法, 是否支持 Flusher 取决于原 http.ResponseWriter 实例.
func (*ResponseWriteFakeFlusher) Size ¶
func (rw *ResponseWriteFakeFlusher) Size() int
* Size 返回通过 Write 的总字节数.
func (*ResponseWriteFakeFlusher) Status ¶
func (rw *ResponseWriteFakeFlusher) Status() int
* Status 返回通过 WriteHeader 设置的值.
func (*ResponseWriteFakeFlusher) Write ¶
func (rw *ResponseWriteFakeFlusher) Write(b []byte) (int, error)
* Write 向相应写入 b, 返回本次写入的字节和发生的错误.
func (*ResponseWriteFakeFlusher) WriteHeader ¶
func (rw *ResponseWriteFakeFlusher) WriteHeader(s int)
* WriteHeader 向相应发送状态码 s.
func (*ResponseWriteFakeFlusher) Written ¶
func (rw *ResponseWriteFakeFlusher) Written() bool
* Written 返回 Status()!=0 || Size()!=0 的结果
type ResponseWriter ¶
type ResponseWriter interface { http.ResponseWriter http.Flusher // Status 返回调用 WriteHeader 设定的值, 初始值为 0 Status() int // Size 返回调用 Write 写入的字节数, 初始值为 0 Size() int /** Written 返回是否已经写入了内容. 包括两种情况, WriteHeader 和 Write. 实现是如何判断的可能有差异. */ Written() bool }
* ResponseWriter 提供状态支持
func NewResponseWriterFakeFlusher ¶
func NewResponseWriterFakeFlusher(rw http.ResponseWriter) ResponseWriter
* NewResponseWriterFakeFlusher 返回 ResponseWriter 实例, 可能是伪 http.Flusher. 如果 rw 已经实现了 ResponseWriter 接口, 返回 rw.(ResponseWriter). 否则返回 &ResponseWriteFakeFlusher 伪 http.Flusher 实例.
type Rivet ¶
type Rivet struct { Params PathParams // contains filtered or unexported fields }
* Rivet 符合 Context 接口. 请使用 NewContext 生成实例.
func (*Rivet) Get ¶
* Get 以类型标识 t 为 key, 获取关联到 context 的变量. 如果未找到, 通常返回 nil, 特别的:
如果 t 代表 map[string]interface{}, 用 Params 标识再试一次. 如果 t 代表 map[string]string, 用 PathParams 标识再试一次.
这样做, 如果不用 Map 功能, 所写的 Handler 就不需要 import rivet.
func (*Rivet) GetPathParams ¶
func (c *Rivet) GetPathParams() PathParams
* PathParams 返回路由匹配时从 URL.Path 中提取的参数 此方法与 Scene/NewScene 配套使用.
func (*Rivet) Handlers ¶
func (c *Rivet) Handlers(handler ...interface{})
Handlers 设置 handler, 首次使用有效.
func (*Rivet) Invoke ¶
* Invoke 处理 handler.
参数:
handler 可以是任意值 如果 handler 可被调用, 准备相应参数, 并调用 handler. 否则 使用 Map 关联到 context.
返回:
如果 handler 可被调用, 但是无法获取其参数, 返回 false. 否则返回 true.
算法:
如果 handler 是函数或者是有 ServeHTTP 方法的对象, 准备参数并调用. 否则使用 Map 关联到 context. ServeHTTP 支持泛类型, 当然包括 http.Handler 实例. 下列 handler 类型使用 switch 匹配, 参数直接传递, 未用 Get 从 context 获取: func() func(Context) func(*http.Request) func(ResponseWriter) func(ResponseWriter, *http.Request) func(http.ResponseWriter) func(http.ResponseWriter, *http.Request) func(map[string]interface{}, http.ResponseWriter, *http.Request) func(Params, *http.Request) func(Params, ResponseWriter) func(Params, http.ResponseWriter) func(Params, ResponseWriter, *http.Request) func(Params, http.ResponseWriter, *http.Request) func(map[string]string, http.ResponseWriter, *http.Request) func(PathParams, *http.Request) func(PathParams, ResponseWriter) func(PathParams, http.ResponseWriter) func(PathParams, ResponseWriter, *http.Request) func(PathParams, http.ResponseWriter, *http.Request) http.Handler
提示:
Invoke 未捕获可能产生的 panic, 需要使用者处理.
func (*Rivet) Map ¶
func (r *Rivet) Map(v interface{})
* Map 等同 MapTo(v, TypeIdOf(v)). 以 v 的类型标识为 key. Rivet 自动 Map 的变量类型有:
Context Params PathParams ResponseWriter http.ResponseWriter *http.Request
func (*Rivet) MapTo ¶
* MapTo 以 t 为 key 把变量 v 关联到 context. 相同 t 值只保留一个. 调用者也许会自己定义一个值, 注意不要和真实类型标识冲突. 否则会导致不可预计的错误.
func (*Rivet) Next ¶
func (c *Rivet) Next()
* Next 遍历 Handlers 保存的 handler, 通过 Invoke 调用. 如果 ResponseWriter.Written() 为 true, 终止遍历. Next 最后会调用 ResponseWriter.Flush(), 清空 handler.
func (*Rivet) ParamsReceiver ¶
* ParamsReceiver 逐个接收从 URL.Path 中提取的参数. 此方法把参数值 val 保存在 Params 字段中. 把原始参数值 text 保存在 PathParams 字段中.
func (*Rivet) Response ¶
func (c *Rivet) Response() http.ResponseWriter
Response 返回生成 Context 的 http.ResponseWriter
type Riveter ¶
type Riveter func(http.ResponseWriter, *http.Request) Context
* Riveter 是 Context 生成器.
type Router ¶
type Router struct {
// contains filtered or unexported fields
}
* Router 管理路由.
func NewRouter ¶
* NewRouter 新建 *Router, 并设置 NotFound Handler 为 http.NotFound. 参数:
rivet 用于生成 Context 实例, 如果为 nil 使用 NewContext 创建.
func (*Router) Handle ¶
* Handle 为 HTTP method request 设置路由的通用形式. 如果 method, pattern 对应的路由重复, 直接返回对应的节点. 否则添加新节点. 参数:
method "*" 等效 Any. 其它值不做处理, 直接和 http.Request.Method 比较. pattern 为空等效 NotFound 方法.
事实上 Router 不限制 method 的名称, 可随意定义.
func (*Router) Match ¶
func (r *Router) Match(method, urlPath string, rec ParamsReceiver, rw http.ResponseWriter, req *http.Request) Node
* Match 匹配路由节点. 如果匹配失败, 返回 NotFound 节点. 参数:
method Request.Method, 确定对应的 Root Trie. urlPath Request.URL.Path, 传递给 Trie. rec URL.Path 参数接收器, 传递给 Trie. rw http 响应, 传递给 Trie. req http 请求, 传递给 Trie.
func (*Router) NodeBuilder ¶
func (r *Router) NodeBuilder(nb NodeBuilder)
* 设置 NodeBuilder, 默认使用 NewNode.
type Scene ¶
type Scene struct {
*Rivet
}
* Scene 支持 Handler 参数类型为 PathParams 的风格. PathParams 省去了 URL.Path 参数转换的结果, 如果 Filter 中没有用到类型转换, 使用 Scene 是合适的.
func (Scene) ParamsReceiver ¶
* ParamsReceiver 逐个接收从 URL.Path 中提取的参数. 此方法把参数值 text 保存在 PathParams 字段中.
type Trie ¶
type Trie struct {
// contains filtered or unexported fields
}
* Trie 管理路由 patterns. Trie 不直接管理路由 Handler, 由使用者通过 SetId 进行组织管理. id 为 0 的节点保留给内部算法使用, 所以 0 值表示非路由节点.
请使用 NewRootTrie 获得根节点. 使用 Print 方法有助于了 Trie 的结构和算法.
func (*Trie) Add ¶
func (t *Trie) Add(path string, newFilter FilterBuilder) *Trie
* Add 添加路由 pattern 返回相应的节点.
参数:
path 路由 pattern. 必须以 "/" 开头. newFilter Filter 生成器, 如果为 nil, 用函数 NewFilter 代替.
返回:
返回对应 path 的节点, 如果 path 重复, 返回原有节点.
注意: 因为 Add 允许重复, 调用者应该先判断 GetId() 是否为 0, 再确定是否要 SetId.
func (*Trie) Match ¶
func (t *Trie) Match(path string, rec ParamsReceiver, rw http.ResponseWriter, req *http.Request) *Trie
* Match 匹配 URL.Path, 返回匹配到的节点. 参数:
path 待匹配的 URL.Path rec 指定参数接收器, 如果为 nil 表示丢弃参数. rw, req 供 Filter 使用, 如果 Filter 不需要的话, 可以为 nil
返回:
成功返回对应的节点, 该节点 GetId() 一定不为 0. 失败返回 nil.