Documentation
¶
Overview ¶
Package mux 功能完备的路由中间件
提供了泛型版本 RouterOf,适用第三方框架自由实现路由。 同时基于 RouterOf 提供了适配 http.Handler 路由 Router。
语法
路由参数采用大括号包含,内部包含名称和规则两部分:`{name:rule}`, 其中的 name 表示参数的名称,rule 表示对参数的约束规则。
name 可以包含 `-` 前缀,表示在实际执行过程中,不捕获该名称的对应的值, 可以在一定程序上提升性能。
rule 表示对参数的约束,一般为正则或是空,为空表示匹配任意值, 拦截器一栏中有关 rule 的高级用法。以下是一些常见的示例。
/posts/{id}.html // 匹配 /posts/1.html /posts-{id}-{page}.html // 匹配 /posts-1-10.html /posts/{path:\\w+}.html // 匹配 /posts/2020/11/11/title.html /tags/{tag:\\w+}/{path} // 匹配 /tags/abc/title.html
Index ¶
- func CheckSyntax(pattern string) error
- func DefaultCall(w http.ResponseWriter, r *http.Request, ps Params, h http.Handler)
- func InterceptorAny(rule string) bool
- func InterceptorDigit(rule string) bool
- func InterceptorWord(rule string) bool
- func Methods() []string
- func URL(pattern string, params map[string]string) (string, error)
- func WithValue(r *http.Request, ps Params) *http.Request
- type CORS
- type CallOf
- type InterceptorFunc
- type Matcher
- type MatcherFunc
- type Middleware
- type MiddlewareFunc
- type MiddlewareFuncOf
- type MiddlewareOf
- type Options
- type Params
- type Prefix
- type PrefixOf
- func (p *PrefixOf[T]) Any(pattern string, h T) *PrefixOf[T]
- func (p *PrefixOf[T]) Clean()
- func (p *PrefixOf[T]) Delete(pattern string, h T) *PrefixOf[T]
- func (p *PrefixOf[T]) Get(pattern string, h T) *PrefixOf[T]
- func (p *PrefixOf[T]) Handle(pattern string, h T, methods ...string) *PrefixOf[T]
- func (p *PrefixOf[T]) Patch(pattern string, h T) *PrefixOf[T]
- func (p *PrefixOf[T]) Post(pattern string, h T) *PrefixOf[T]
- func (p *PrefixOf[T]) Prefix(prefix string, m ...MiddlewareOf[T]) *PrefixOf[T]
- func (p *PrefixOf[T]) Put(pattern string, h T) *PrefixOf[T]
- func (p *PrefixOf[T]) Remove(pattern string, methods ...string)
- func (p *PrefixOf[T]) Resource(pattern string, m ...MiddlewareOf[T]) *ResourceOf[T]
- func (p *PrefixOf[T]) Router() *RouterOf[T]
- func (p *PrefixOf[T]) URL(strict bool, pattern string, params map[string]string) (string, error)
- type RecoverFunc
- type Resource
- type ResourceOf
- func (r *ResourceOf[T]) Any(h T) *ResourceOf[T]
- func (r *ResourceOf[T]) Clean()
- func (r *ResourceOf[T]) Delete(h T) *ResourceOf[T]
- func (r *ResourceOf[T]) Get(h T) *ResourceOf[T]
- func (r *ResourceOf[T]) Handle(h T, methods ...string) *ResourceOf[T]
- func (r *ResourceOf[T]) Patch(h T) *ResourceOf[T]
- func (r *ResourceOf[T]) Post(h T) *ResourceOf[T]
- func (r *ResourceOf[T]) Put(h T) *ResourceOf[T]
- func (r *ResourceOf[T]) Remove(methods ...string)
- func (r *ResourceOf[T]) Router() *RouterOf[T]
- func (r *ResourceOf[T]) URL(strict bool, params map[string]string) (string, error)
- type Router
- type RouterOf
- func (r *RouterOf[T]) Any(pattern string, h T) *RouterOf[T]
- func (r *RouterOf[T]) Clean()
- func (r *RouterOf[T]) Delete(pattern string, h T) *RouterOf[T]
- func (r *RouterOf[T]) Get(pattern string, h T) *RouterOf[T]
- func (r *RouterOf[T]) Handle(pattern string, h T, methods ...string) *RouterOf[T]
- func (r *RouterOf[T]) Name() string
- func (r *RouterOf[T]) Patch(pattern string, h T) *RouterOf[T]
- func (r *RouterOf[T]) Post(pattern string, h T) *RouterOf[T]
- func (r *RouterOf[T]) Prefix(prefix string, m ...MiddlewareOf[T]) *PrefixOf[T]
- func (r *RouterOf[T]) Put(pattern string, h T) *RouterOf[T]
- func (r *RouterOf[T]) Remove(pattern string, methods ...string)
- func (r *RouterOf[T]) Resource(pattern string, m ...MiddlewareOf[T]) *ResourceOf[T]
- func (r *RouterOf[T]) Routes() map[string][]string
- func (r *RouterOf[T]) ServeHTTP(w http.ResponseWriter, req *http.Request)
- func (r *RouterOf[T]) URL(strict bool, pattern string, params map[string]string) (string, error)
- func (r *RouterOf[T]) Use(m ...MiddlewareOf[T])
- type Routers
- type RoutersOf
- func (rs *RoutersOf[T]) Add(matcher Matcher, r *RouterOf[T])
- func (rs *RoutersOf[T]) New(name string, matcher Matcher, o *Options) *RouterOf[T]
- func (rs *RoutersOf[T]) Remove(name string)
- func (rs *RoutersOf[T]) Router(name string) *RouterOf[T]
- func (rs *RoutersOf[T]) Routers() []*RouterOf[T]
- func (rs *RoutersOf[T]) Routes() map[string]map[string][]string
- func (rs *RoutersOf[T]) ServeHTTP(w http.ResponseWriter, r *http.Request)
- func (rs *RoutersOf[T]) Use(m ...MiddlewareOf[T])
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func DefaultCall ¶
DefaultCall 针对 http.Handler 的 CallOf 实现
Types ¶
type CORS ¶
type CORS struct { // Origins 对应 Origin 报头 // // 如果包含了 *,那么其它的设置将不再启作用。 // 如果此值为空,表示不启用跨域的相关设置; Origins []string // AllowHeaders 对应 Access-Control-Allow-Headers // // 可以包含 *,表示可以是任意值,其它值将不再启作用; AllowHeaders []string // ExposedHeaders 对应 Access-Control-Expose-Headers ExposedHeaders []string // MaxAge 对应 Access-Control-Max-Age // // 有以下几种取值: // 0 不输出该报头; // -1 表示禁用; // 其它 >= -1 的值正常输出数值; MaxAge int // AllowCredentials 对应 Access-Control-Allow-Credentials AllowCredentials bool // contains filtered or unexported fields }
CORS 自定义跨域请求设置项
type Matcher ¶
type Matcher interface { // Match 验证请求是否符合当前对象的要求 // // ps 为匹配过程中生成的参数信息,可以返回 nil; // ok 表示是否匹配成功; Match(r *http.Request) (ps params.Params, ok bool) }
Matcher 验证一个请求是否符合要求
Matcher 用于路由项的前置判断,用于对路由项进行归类, 符合同一个 Matcher 的路由项,再各自进行路由。比如按域名进行分组路由。
type Middleware ¶
type MiddlewareFunc ¶
type MiddlewareFuncOf ¶
type MiddlewareFuncOf[T any] func(T) T
MiddlewareFuncOf 中间件处理函数
func (MiddlewareFuncOf[T]) Middleware ¶
func (f MiddlewareFuncOf[T]) Middleware(next T) T
type MiddlewareOf ¶
type MiddlewareOf[T any] interface { Middleware(T) T }
MiddlewareOf 中间件对象需要实现的接口
type Options ¶
type Options struct { // CaseInsensitive 忽略大小写 // // 该操作仅是将客户端的请求路径转换为小之后再次进行匹配, // 如果服务端的路由项设置为大写,则依然是不匹配的。 CaseInsensitive bool // Lock 是否加锁 // // 在调用 RouterOf.Add 添加路由时,有可能会改变整个路由树的结构, // 如果需要频繁在运行时添加和删除路由项,那么应当添加此选项。 Lock bool // CORS 自定义跨域请求设置项 // // 为空表示禁用跨域; CORS *CORS // Interceptors 针对带参数类型路由的拦截处理 // // 在解析诸如 /authors/{id:\\d+} 带参数的路由项时, // 用户可以通过拦截并自定义对参数部分 {id:\\d+} 的解析, // 从而不需要走正则表达式的那一套解析流程,可以在一定程度上增强性能。 // // 一旦正则表达式被拦截,则节点类型也将不再是正则表达式, // 其处理优先级会比正则表达式类型高。 在某些情况下,可能会造成处理结果不相同。比如: // /authors/{id:\\d+} // 1 // /authors/{id:[0-9]+} // 2 // 以上两条记录是相同的,但因为表达式不同,也能正常添加, // 处理流程,会按添加顺序优先比对第一条,所以第二条是永远无法匹配的。 // 但是如果你此时添加了 (InterceptorDigit, "[0-9]+"), // 使第二个记录的优先级提升,会使第一条永远无法匹配到数据。 Interceptors map[string]InterceptorFunc // URLDomain 为 RouterOf.URL 生成的地址带上域名 URLDomain string // RecoverFunc 用于指路由 panic 之后的处理方法 RecoverFunc RecoverFunc NotFound, MethodNotAllowed http.Handler // contains filtered or unexported fields }
type Params ¶
Params 路由参数
type PrefixOf ¶
type PrefixOf[T any] struct { // contains filtered or unexported fields }
PrefixOf 操纵统一前缀的路由
func (*PrefixOf[T]) Clean ¶
func (p *PrefixOf[T]) Clean()
Clean 清除所有以 PrefixOf.prefix 开头的路由项
当指定多个相同的 PrefixOf 时,调用其中的一个 Clean 也将会清除其它的:
r := NewRouterOf(...) p1 := r.Prefix("prefix") p2 := r.Prefix("prefix") p2.Clean() 将同时清除 p1 的内容,因为有相同的前缀。
func (*PrefixOf[T]) Prefix ¶
func (p *PrefixOf[T]) Prefix(prefix string, m ...MiddlewareOf[T]) *PrefixOf[T]
Prefix 在现有 PrefixOf 的基础上声明一个新的 PrefixOf 实例
m 中间件函数,按顺序调用,会继承 p 的中间件并按在 m 之前;
type RecoverFunc ¶
type RecoverFunc func(http.ResponseWriter, any)
func LogRecovery ¶
func LogRecovery(status int, l *log.Logger) RecoverFunc
LogRecovery 将错误信息输出到日志
status 表示向客户端输出的状态码; l 为输出的日志;
func WriterRecovery ¶
func WriterRecovery(status int, out io.Writer) RecoverFunc
WriterRecovery 向 io.Writer 输出错误信息
status 表示向客户端输出的状态码; out 输出的 io.Writer,比如 os.Stderr 等;
type ResourceOf ¶
type ResourceOf[T any] struct { // contains filtered or unexported fields }
ResourceOf 以资源地址为对象的路由
func (*ResourceOf[T]) Handle ¶
func (r *ResourceOf[T]) Handle(h T, methods ...string) *ResourceOf[T]
func (*ResourceOf[T]) Remove ¶
func (r *ResourceOf[T]) Remove(methods ...string)
Remove 删除指定匹配模式的路由项
func (*ResourceOf[T]) Router ¶
func (r *ResourceOf[T]) Router() *RouterOf[T]
Router 返回与当前资源关联的 *Router 实例
func (*ResourceOf[T]) URL ¶
URL 根据参数构建一条 URL
params 匹配路由参数中的同名参数,或是不存在路由参数,比如普通的字符串路由项, 该参数不启作用;
res, := m.Resource("/posts/{id}") res.URL(map[string]string{"id": "1"}, "") // /posts/1 res, := m.Resource("/posts/{id}/{path}") res.URL(map[string]string{"id": "1","path":"author/profile"}) // /posts/1/author/profile
type RouterOf ¶
type RouterOf[T any] struct { // contains filtered or unexported fields }
RouterOf 路由
可以对路径按正则或是请求方法进行匹配。用法如下:
router := NewRouterOf[http.Handler](...) router.Get("/abc/h1", h1). Post("/abc/h2", h2). Handle("/api/{version:\\d+}",h3, http.MethodGet, http.MethodPost) // 只匹配 GET 和 POST http.ListenAndServe(router)
如果需要同时对多个 RouterOf 实例进行路由,可以采用 RoutersOf 对象管理多个 RouterOf 实例。
func NewRouterOf ¶
NewRouterOf 声明路由
name string 路由名称,可以为空;
o 修改路由的默认形为。比如 CaseInsensitive 会让路由忽略大小写,可以为空。
T 表示用户用于处理路由项的方法,该类型最终通过 NewRouterOf 中的 call 参数与 http.ResponseWriter 和 *http.Request 相关联。
func (*RouterOf[T]) Get ¶
Get 相当于 RouterOf.Handle(pattern, h, http.MethodGet) 的简易写法
h 不应该主动调用 WriteHeader,否则会导致 HEAD 请求获取不到 Content-Length 报头。
func (*RouterOf[T]) Handle ¶
Handle 添加一条路由数据
pattern 为路由匹配模式,可以是正则匹配也可以是字符串匹配, 若语法不正确,则直接 panic,可以通过 CheckSyntax 检测语法的有效性,其它接口也相同。 methods 该路由项对应的请求方法,如果未指定值,则表示所有支持的请求方法, 但不包含 OPTIONS 和 HEAD。
func (*RouterOf[T]) Prefix ¶
Prefix 声明一个 Prefix 实例
prefix 路由前缀字符串,可以为空; m 中间件函数,按顺序调用,会继承 r 的中间件并按在 m 之前;
func (*RouterOf[T]) Remove ¶
Remove 移除指定的路由项
当未指定 methods 时,将删除所有 method 匹配的项。 指定错误的 methods 值,将自动忽略该值。
func (*RouterOf[T]) ServeHTTP ¶
func (r *RouterOf[T]) ServeHTTP(w http.ResponseWriter, req *http.Request)
type Routers ¶
func NewRouters ¶
type RoutersOf ¶
type RoutersOf[T any] struct { // contains filtered or unexported fields }
RoutersOf 一组路由的集合
func NewRoutersOf ¶
NewRoutersOf 声明一个新的 RoutersOf
notFound 表示所有路由都不匹配时的处理方式,如果为空,则调用 http.NotFoundHandler。
func (*RoutersOf[T]) Add ¶
Add 添加路由
matcher 用于判断进入 r 的条件,如果为空,则表示不作判断。 如果有多个 matcher 都符合条件,第一个符合条件的 r 获得优胜;
Directories
¶
Path | Synopsis |
---|---|
internal
|
|
syntax
Package syntax 负责处理路由语法
|
Package syntax 负责处理路由语法 |
tree
Package tree 提供了以树形结构保存路由项的相关操作
|
Package tree 提供了以树形结构保存路由项的相关操作 |
Package muxutil 为 mux 提供的一些额外工具
|
Package muxutil 为 mux 提供的一些额外工具 |
Package params 路由参数的相关声明
|
Package params 路由参数的相关声明 |
Package routertest 提供针对路由的测试用例 NOTE: 只提供针对不同的类型参数 T 可能造成不周结果的测试。
|
Package routertest 提供针对路由的测试用例 NOTE: 只提供针对不同的类型参数 T 可能造成不周结果的测试。 |