Documentation
¶
Overview ¶
Package mux 适用第三方框架实现可定制的路由
语法 ¶
路由参数采用大括号包含,内部包含名称和规则两部分:`{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 AnyMethods() []string
- func CheckSyntax(pattern string) error
- func Methods() []string
- func Trace(w http.ResponseWriter, r *http.Request, body bool)
- func URL(pattern string, params map[string]string) (string, error)
- type CallFunc
- type Group
- func (g *Group[T]) Add(matcher Matcher, r *Router[T])
- func (g *Group[T]) New(name string, matcher Matcher, o ...Option) *Router[T]
- func (g *Group[T]) Remove(name string)
- func (g *Group[T]) Router(name string) *Router[T]
- func (g *Group[T]) Routers() []*Router[T]
- func (g *Group[T]) Routes() map[string]map[string][]string
- func (g *Group[T]) ServeHTTP(w http.ResponseWriter, r *http.Request)
- func (g *Group[T]) Use(m ...types.Middleware[T])
- type Hosts
- type InterceptorFunc
- type Matcher
- func AndMatcher(m ...Matcher) Matcher
- func AndMatcherFunc(f ...func(*http.Request, *types.Context) bool) Matcher
- func NewHeaderVersion(param, key string, errlog func(error), version ...string) Matcher
- func NewPathVersion(param string, version ...string) Matcher
- func OrMatcher(m ...Matcher) Matcher
- func OrMatcherFunc(f ...func(*http.Request, *types.Context) bool) Matcher
- type MatcherFunc
- type Option
- func WithAllowedCORS(maxAge int) Option
- func WithAnyInterceptor(rule string) Option
- func WithCORS(origin []string, allowHeaders []string, exposedHeaders []string, maxAge int, ...) Option
- func WithDenyCORS() Option
- func WithDigitInterceptor(rule string) Option
- func WithInterceptor(f InterceptorFunc, rule ...string) Option
- func WithLock(l bool) Option
- func WithLogRecovery(status int, l *log.Logger) Option
- func WithRecovery(f RecoverFunc) Option
- func WithSLogRecovery(status int, l *slog.Logger) Option
- func WithStatusRecovery(status int) Option
- func WithTrace[T any](v T) Option
- func WithURLDomain(prefix string) Option
- func WithWordInterceptor(rule string) Option
- func WithWriteRecovery(status int, out io.Writer) Option
- type Prefix
- func (p *Prefix[T]) Any(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
- func (p *Prefix[T]) Clean()
- func (p *Prefix[T]) Delete(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
- func (p *Prefix[T]) Get(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
- func (p *Prefix[T]) Handle(pattern string, h T, m []types.Middleware[T], methods ...string) *Prefix[T]
- func (p *Prefix[T]) Patch(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
- func (p *Prefix[T]) Pattern() string
- func (p *Prefix[T]) Post(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
- func (p *Prefix[T]) Prefix(prefix string, m ...types.Middleware[T]) *Prefix[T]
- func (p *Prefix[T]) Put(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
- func (p *Prefix[T]) Remove(pattern string, methods ...string)
- func (p *Prefix[T]) Resource(pattern string, m ...types.Middleware[T]) *Resource[T]
- func (p *Prefix[T]) Router() *Router[T]
- func (p *Prefix[T]) URL(strict bool, pattern string, params map[string]string) (string, error)
- type RecoverFunc
- type Resource
- func (r *Resource[T]) Any(h T, m ...types.Middleware[T]) *Resource[T]
- func (r *Resource[T]) Clean()
- func (r *Resource[T]) Delete(h T, m ...types.Middleware[T]) *Resource[T]
- func (r *Resource[T]) Get(h T, m ...types.Middleware[T]) *Resource[T]
- func (r *Resource[T]) Handle(h T, m []types.Middleware[T], methods ...string) *Resource[T]
- func (r *Resource[T]) Patch(h T, m ...types.Middleware[T]) *Resource[T]
- func (r *Resource[T]) Pattern() string
- func (r *Resource[T]) Post(h T, m ...types.Middleware[T]) *Resource[T]
- func (r *Resource[T]) Put(h T, m ...types.Middleware[T]) *Resource[T]
- func (r *Resource[T]) Remove(methods ...string)
- func (r *Resource[T]) Router() *Router[T]
- func (r *Resource[T]) URL(strict bool, params map[string]string) (string, error)
- type Router
- func (r *Router[T]) Any(pattern string, h T, m ...types.Middleware[T]) *Router[T]
- func (r *Router[T]) Clean()
- func (r *Router[T]) Delete(pattern string, h T, m ...types.Middleware[T]) *Router[T]
- func (r *Router[T]) Get(pattern string, h T, m ...types.Middleware[T]) *Router[T]
- func (r *Router[T]) Handle(pattern string, h T, m []types.Middleware[T], methods ...string) *Router[T]
- func (r *Router[T]) Name() string
- func (r *Router[T]) Patch(pattern string, h T, m ...types.Middleware[T]) *Router[T]
- func (r *Router[T]) Post(pattern string, h T, m ...types.Middleware[T]) *Router[T]
- func (r *Router[T]) Prefix(prefix string, m ...types.Middleware[T]) *Prefix[T]
- func (r *Router[T]) Put(pattern string, h T, m ...types.Middleware[T]) *Router[T]
- func (r *Router[T]) Remove(pattern string, methods ...string)
- func (r *Router[T]) Resource(pattern string, m ...types.Middleware[T]) *Resource[T]
- func (r *Router[T]) Routes() map[string][]string
- func (r *Router[T]) ServeHTTP(w http.ResponseWriter, req *http.Request)
- func (r *Router[T]) URL(strict bool, pattern string, params map[string]string) (string, error)
- func (r *Router[T]) Use(m ...types.Middleware[T])
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Group ¶
type Group[T any] struct { // contains filtered or unexported fields }
Group 管理一组 Router
func NewGroup ¶
func NewGroup[T any]( call CallFunc[T], notFound T, methodNotAllowedBuilder, optionsBuilder types.BuildNodeHandler[T], o ...Option, ) *Group[T]
NewGroup 声明 Group 对象
func (*Group[T]) Add ¶
Add 添加路由
matcher 用于判断进入 r 的条件,如果为空,则表示不作判断。 如果有多个 matcher 都符合条件,第一个符合条件的 r 获得优胜;
type Hosts ¶
type Hosts struct {
// contains filtered or unexported fields
}
Hosts 限定域名的匹配工具
func (*Hosts) Add ¶
Add 添加新的域名
域名的格式和路由的语法格式是一样的,比如:
api.example.com {sub:[a-z]+}.example.com
如果存在命名参数,也可以通过也可通过 types.Params 接口获取。 当语法错误时,会触发 panic,可通过 CheckSyntax 检测语法的正确性。
func (*Hosts) RegisterInterceptor ¶
func (hs *Hosts) RegisterInterceptor(f InterceptorFunc, name ...string)
RegisterInterceptor 注册拦截器
NOTE: 拦截器只有在注册之后添加的域名才有效果。
type InterceptorFunc ¶
type InterceptorFunc = syntax.InterceptorFunc
type Matcher ¶
type Matcher interface { // Match 验证请求是否符合当前对象的要求 // // 如果返回 false,那么不应当对参所指向的内容作修改,否则可能影响后续的判断。 Match(*http.Request, *types.Context) bool }
Matcher 验证一个请求是否符合要求
Matcher 用于路由项的前置判断,用于对路由项进行归类, 符合同一个 Matcher 的路由项,再各自进行路由。比如按域名进行分组路由。
func AndMatcherFunc ¶
AndMatcherFunc 需同时符合每一个要求
func NewHeaderVersion ¶
NewHeaderVersion 声明匹配报头 Accept 中版本号的 Matcher 实现
param 将版本号作为参数保存到上下文中时的名称,如果不需要保存参数,可以设置为空值; errlog 错误日志输出通道,如果为空则采用 log.Default; key 表示在 accept 报头中的表示版本号的参数名,如果为空则采用 version; version 版本的值,可能为空,表示匹配任意值;
func NewPathVersion ¶
NewPathVersion 声明匹配路径中版本号的 Matcher 实例
param 将版本号作为参数保存到上下文中是的名称,如果不需要保存参数,可以设置为空值; version 版本的值,可以为空,表示匹配任意值;
NOTE: 会修改 [http.Request.URL.Path] 的值,去掉匹配的版本号路径部分,比如:
/v1/path.html
如果匹配 v1 版本,会修改为:
/path.html
type MatcherFunc ¶
type Option ¶
type Option func(*options)
func WithCORS ¶
func WithCORS(origin []string, allowHeaders []string, exposedHeaders []string, maxAge int, allowCredentials bool) Option
WithCORS 自定义跨域请求设置项
origin 对应 Origin 报头。如果包含了 *,那么其它的设置将不再启作用。 如果此值为空,表示不启用跨域的相关设置;
allowHeaders 对应 Access-Control-Allow-Headers 可以包含 *,表示可以是任意值,其它值将不再启作用;
exposedHeaders 对应 Access-Control-Expose-Headers;
maxAge 对应 Access-Control-Max-Age 有以下几种取值:
- 0 不输出该报头;
- -1 表示禁用;
- 其它 >= -1 的值正常输出数值;
allowCredentials 对应 Access-Control-Allow-Credentials;
func WithDigitInterceptor ¶
WithDigitInterceptor 任意数字字符的拦截器
func WithInterceptor ¶
func WithInterceptor(f InterceptorFunc, rule ...string) Option
WithInterceptor 针对带参数类型路由的拦截处理
在解析诸如 /authors/{id:\\d+} 带参数的路由项时, 用户可以通过拦截并自定义对参数部分 {id:\\d+} 的解析, 从而不需要走正则表达式的那一套解析流程,可以在一定程度上增强性能。
一旦正则表达式被拦截,则节点类型也将不再是正则表达式, 其处理优先级会比正则表达式类型高。 在某些情况下,可能会造成处理结果不相同。比如:
/authors/{id:\\d+} // 1 /authors/{id:[0-9]+} // 2
以上两条记录是相同的,但因为表达式不同,也能正常添加, 处理流程,会按添加顺序优先比对第一条,所以第二条是永远无法匹配的。 但是如果你此时添加了 (InterceptorDigit, "[0-9]+"), 使第二个记录的优先级提升,会使第一条永远无法匹配到数据。
可多次调用,表示同时指定了多个。
func WithLock ¶
WithLock 是否加锁
在调用 Router.Handle 等添加路由时,有可能会改变整个路由树的结构, 如果需要频繁在运行时添加和删除路由项,那么应当添加此选项。
func WithRecovery ¶
func WithRecovery(f RecoverFunc) Option
WithRecovery 用于指定路由 panic 之后的处理方法
如果多次指定,则最后一次启作用。
func WithStatusRecovery ¶
WithStatusRecovery 仅向客户端输出 status 状态码
func WithTrace ¶
WithTrace 指定用于处理 TRACE 请求的方法
T 的类型应该同 NewRouter 中的类型参数 T,否则会 panic。
NOTE: Trace 提供了一种简单的 TRACE 处理方式。
func WithWordInterceptor ¶
WithWordInterceptor 任意英文单词的拦截器
type Prefix ¶
type Prefix[T any] struct { // contains filtered or unexported fields }
Prefix 操纵统一前缀的路由
func (*Prefix[T]) Any ¶
func (p *Prefix[T]) Any(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
func (*Prefix[T]) Clean ¶
func (p *Prefix[T]) Clean()
Clean 清除所有以 Prefix.Pattern 开头的路由项
当指定多个相同的 Prefix 时,调用其中的一个 Prefix.Clean 也将会清除其它的:
r := NewRouter(...) p1 := r.Prefix("prefix") p2 := r.Prefix("prefix") p2.Clean() 将同时清除 p1 的内容,因为有相同的前缀。
func (*Prefix[T]) Delete ¶
func (p *Prefix[T]) Delete(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
func (*Prefix[T]) Get ¶
func (p *Prefix[T]) Get(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
func (*Prefix[T]) Handle ¶
func (p *Prefix[T]) Handle(pattern string, h T, m []types.Middleware[T], methods ...string) *Prefix[T]
func (*Prefix[T]) Patch ¶
func (p *Prefix[T]) Patch(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
func (*Prefix[T]) Post ¶
func (p *Prefix[T]) Post(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
func (*Prefix[T]) Prefix ¶
func (p *Prefix[T]) Prefix(prefix string, m ...types.Middleware[T]) *Prefix[T]
Prefix 在现有 Prefix 的基础上声明一个新的 Prefix 实例
m 中间件函数,按顺序调用可参考 Router.Use 的说明;
func (*Prefix[T]) Put ¶
func (p *Prefix[T]) Put(pattern string, h T, m ...types.Middleware[T]) *Prefix[T]
func (*Prefix[T]) Resource ¶
func (p *Prefix[T]) Resource(pattern string, m ...types.Middleware[T]) *Resource[T]
Resource 创建一个资源路由项
pattern 资源地址; m 中间件函数,按顺序调用可参考 Router.Use 的说明;
type RecoverFunc ¶
type RecoverFunc = func(http.ResponseWriter, any)
type Resource ¶
type Resource[T any] struct { // contains filtered or unexported fields }
Resource 以资源地址为对象的路由
func (*Resource[T]) Any ¶
func (r *Resource[T]) Any(h T, m ...types.Middleware[T]) *Resource[T]
func (*Resource[T]) Delete ¶
func (r *Resource[T]) Delete(h T, m ...types.Middleware[T]) *Resource[T]
func (*Resource[T]) Get ¶
func (r *Resource[T]) Get(h T, m ...types.Middleware[T]) *Resource[T]
func (*Resource[T]) Handle ¶
func (r *Resource[T]) Handle(h T, m []types.Middleware[T], methods ...string) *Resource[T]
func (*Resource[T]) Patch ¶
func (r *Resource[T]) Patch(h T, m ...types.Middleware[T]) *Resource[T]
func (*Resource[T]) Post ¶
func (r *Resource[T]) Post(h T, m ...types.Middleware[T]) *Resource[T]
func (*Resource[T]) Put ¶
func (r *Resource[T]) Put(h T, m ...types.Middleware[T]) *Resource[T]
func (*Resource[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 Router ¶
type Router[T any] struct { // contains filtered or unexported fields }
Router 可自定义处理函数类型的路由
router := NewRouter[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)
func NewRouter ¶
func NewRouter[T any]( name string, call CallFunc[T], notFound T, methodNotAllowedBuilder, optionsBuilder types.BuildNodeHandler[T], o ...Option, ) *Router[T]
NewRouter 声明路由
name 路由名称,可以为空; methodNotAllowedBuilder 和 optionsBuilder 可以自定义 405 和 OPTIONS 请求的处理方式; o 用于指定一些可选的参数;
T 表示用户用于处理路由项的方法。
func (*Router[T]) Any ¶
func (r *Router[T]) Any(pattern string, h T, m ...types.Middleware[T]) *Router[T]
Any 添加一条包含 AnyMethods 中请求方法的路由
func (*Router[T]) Delete ¶
func (r *Router[T]) Delete(pattern string, h T, m ...types.Middleware[T]) *Router[T]
func (*Router[T]) Get ¶
func (r *Router[T]) Get(pattern string, h T, m ...types.Middleware[T]) *Router[T]
Get 相当于 Router.Handle(pattern, h, http.MethodGet) 的简易写法
h 不应该主动调用 WriteHeader,否则会导致 HEAD 请求获取不到 Content-Length 报头。
func (*Router[T]) Handle ¶
func (r *Router[T]) Handle(pattern string, h T, m []types.Middleware[T], methods ...string) *Router[T]
Handle 添加一条路由数据
pattern 为路由匹配模式,可以是正则匹配也可以是字符串匹配, 若语法不正确,则直接 panic,可以通过 CheckSyntax 检测语法的有效性,其它接口也相同; m 为应用于当前路由项的中间件; methods 该路由项对应的请求方法,如果未指定值,则采用 AnyMethods 返回的方法;
func (*Router[T]) Patch ¶
func (r *Router[T]) Patch(pattern string, h T, m ...types.Middleware[T]) *Router[T]
func (*Router[T]) Post ¶
func (r *Router[T]) Post(pattern string, h T, m ...types.Middleware[T]) *Router[T]
func (*Router[T]) Prefix ¶
func (r *Router[T]) Prefix(prefix string, m ...types.Middleware[T]) *Prefix[T]
Prefix 声明一个 Prefix 实例
prefix 路由前缀字符串,可以为空; m 中间件函数,按顺序调用可参考 Router.Use 的说明;
func (*Router[T]) Put ¶
func (r *Router[T]) Put(pattern string, h T, m ...types.Middleware[T]) *Router[T]
func (*Router[T]) Remove ¶
Remove 移除指定的路由项
当未指定 methods 时,将删除所有 method 匹配的项。 指定错误的 methods 值,将自动忽略该值。
func (*Router[T]) Resource ¶
func (r *Router[T]) Resource(pattern string, m ...types.Middleware[T]) *Resource[T]
Resource 创建一个资源路由项
pattern 资源地址; m 中间件函数,按顺序调用,会继承 r 的中间件并按在 m 之前;
func (*Router[T]) ServeHTTP ¶
func (r *Router[T]) ServeHTTP(w http.ResponseWriter, req *http.Request)
func (*Router[T]) URL ¶
URL 根据参数生成地址
strict 是否检查路由是否真实存在以及参数是否符合要求; pattern 为路由项的定义内容; params 为路由项中的参数,键名为参数名,键值为参数值。
func (*Router[T]) Use ¶
func (r *Router[T]) Use(m ...types.Middleware[T])
Use 使用中间件
对于中间件的使用,除了此方法,还可以 Router.Prefix、Router.Resource、Prefix.Prefix 以及添加路由项时指定。调用顺序如下:
- Get/Delete 等添加路由项的方法;
- Router.Prefix、Router.Resource、Prefix.Prefix;
- Router.Use;
NOTE: 对于 404 路由项的只有通过 Router.Use 应用的中间件有效。
Directories
¶
Path | Synopsis |
---|---|
examples
|
|
ctx
Package ctx 自定义路由
|
Package ctx 自定义路由 |
std
Package std 兼容标准库的路由
|
Package std 兼容标准库的路由 |
Package header 定义了 HTTP 请求中的报头
|
Package header 定义了 HTTP 请求中的报头 |
internal
|
|
syntax
Package syntax 负责处理路由语法
|
Package syntax 负责处理路由语法 |
tree
Package tree 提供了以树形结构保存路由项的相关操作
|
Package tree 提供了以树形结构保存路由项的相关操作 |
Package routertest 提供针对路由的测试用例
|
Package routertest 提供针对路由的测试用例 |
Package types 类型的前置声明
|
Package types 类型的前置声明 |