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 可能造成不周结果的测试。 |