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 CheckSyntax(pattern string) error
- func Debug(p string, w http.ResponseWriter, r *http.Request) error
- func Methods() []string
- func ServeFile(fsys fs.FS, p, index string, w http.ResponseWriter, r *http.Request)
- func Trace(w http.ResponseWriter, r *http.Request, body bool) error
- func URL(pattern string, params map[string]string) (string, error)
- type CallOf
- type InterceptorFunc
- type Option
- func AllowedCORS(maxAge int) Option
- func AnyInterceptor(rule string) Option
- func CORS(origin []string, allowHeaders []string, exposedHeaders []string, maxAge int, ...) Option
- func DenyCORS() Option
- func DigitInterceptor(rule string) Option
- func Interceptor(f InterceptorFunc, rule ...string) Option
- func Lock(l bool) Option
- func LogRecovery(status int, l *log.Logger) Option
- func Recovery(f RecoverFunc) Option
- func StatusRecovery(status int) Option
- func URLDomain(prefix string) Option
- func WordInterceptor(rule string) Option
- func WriteRecovery(status int, out io.Writer) Option
- func WriterRecovery(status int, out io.Writer) Optiondeprecated
- 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 ...types.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 ...types.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 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 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 ...types.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 ...types.MiddlewareOf[T]) *ResourceOf[T]
- func (r *RouterOf[T]) Routes() map[string][]string
- func (r *RouterOf[T]) ServeContext(w http.ResponseWriter, req *http.Request, ctx *types.Context)
- 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 ...types.MiddlewareOf[T])
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Debug ¶
Debug 输出调试信息
p 是指路由中的参数名,比如以下示例中,p 的值为 debug:
r.Get("/test{debug}", func(w http.ResponseWriter, r *http.Request) { p := mux.GetParams(r).String("debug") Debug(p, w, r) }
p 所代表的路径包含了前缀的 /。
func ServeFile ¶
ServeFile 提供对静态文件的服务
p 表示需要读取的文件名; index 表示 p 为目录时,默认读取的文件,为空表示 index.html;
如果不需要自定义 index 的功能,则可以直接使用 http.ServeFile 或是 http.ServeFileFS。
Types ¶
type InterceptorFunc ¶
type InterceptorFunc = syntax.InterceptorFunc
type Option ¶
func CORS ¶
func CORS(origin []string, allowHeaders []string, exposedHeaders []string, maxAge int, allowCredentials bool) Option
CORS 自定义跨域请求设置项
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 Interceptor ¶
func Interceptor(f InterceptorFunc, rule ...string) Option
Interceptor 针对带参数类型路由的拦截处理
在解析诸如 /authors/{id:\\d+} 带参数的路由项时, 用户可以通过拦截并自定义对参数部分 {id:\\d+} 的解析, 从而不需要走正则表达式的那一套解析流程,可以在一定程度上增强性能。
一旦正则表达式被拦截,则节点类型也将不再是正则表达式, 其处理优先级会比正则表达式类型高。 在某些情况下,可能会造成处理结果不相同。比如:
/authors/{id:\\d+} // 1 /authors/{id:[0-9]+} // 2
以上两条记录是相同的,但因为表达式不同,也能正常添加, 处理流程,会按添加顺序优先比对第一条,所以第二条是永远无法匹配的。 但是如果你此时添加了 (InterceptorDigit, "[0-9]+"), 使第二个记录的优先级提升,会使第一条永远无法匹配到数据。
可多次调用,表示同时指定了多个。
func WriteRecovery ¶ added in v7.2.0
WriteRecovery 向 io.Writer 输出错误信息
status 表示向客户端输出的状态码; out 表示输出通道,比如 os.Stderr 等;
func WriterRecovery
deprecated
Deprecated: 使用 WriteRecovery 代替
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 时,调用其中的一个 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 ...types.MiddlewareOf[T]) *PrefixOf[T]
Prefix 在现有 PrefixOf 的基础上声明一个新的 PrefixOf 实例
m 中间件函数,按顺序调用,会继承 p 的中间件并按在 m 之前;
func (*PrefixOf[T]) Resource ¶
func (p *PrefixOf[T]) Resource(pattern string, m ...types.MiddlewareOf[T]) *ResourceOf[T]
Resource 创建一个资源路由项
pattern 资源地址; m 中间件函数,按顺序调用,会继承 p 的中间件并按在 m 之前;
type RecoverFunc ¶
type RecoverFunc = options.RecoverFunc
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 返回与当前资源关联的 RouterOf 实例
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)
func NewRouterOf ¶
func NewRouterOf[T any](name string, call CallOf[T], notFound T, methodNotAllowedBuilder, optionsBuilder types.BuildNodeHandleOf[T], o ...Option) *RouterOf[T]
NewRouterOf 声明路由
name 路由名称,可以为空; T 表示用户用于处理路由项的方法。
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 ¶
func (r *RouterOf[T]) Prefix(prefix string, m ...types.MiddlewareOf[T]) *PrefixOf[T]
Prefix 声明一个 PrefixOf 实例
prefix 路由前缀字符串,可以为空; m 中间件函数,按顺序调用,会继承 r 的中间件并按在 m 之前;
func (*RouterOf[T]) Remove ¶
Remove 移除指定的路由项
当未指定 methods 时,将删除所有 method 匹配的项。 指定错误的 methods 值,将自动忽略该值。
func (*RouterOf[T]) Resource ¶
func (r *RouterOf[T]) Resource(pattern string, m ...types.MiddlewareOf[T]) *ResourceOf[T]
Resource 创建一个资源路由项
pattern 资源地址; m 中间件函数,按顺序调用,会继承 r 的中间件并按在 m 之前;
func (*RouterOf[T]) ServeContext ¶
func (*RouterOf[T]) ServeHTTP ¶
func (r *RouterOf[T]) ServeHTTP(w http.ResponseWriter, req *http.Request)
Directories ¶
Path | Synopsis |
---|---|
examples
|
|
ctx
Package ctx 自定义路由
|
Package ctx 自定义路由 |
std
Package std 兼容标准库的路由
|
Package std 兼容标准库的路由 |
Package group 提供了针对一组路由的操作
|
Package group 提供了针对一组路由的操作 |
internal
|
|
options
Package options 构建路由的参数
|
Package options 构建路由的参数 |
syntax
Package syntax 负责处理路由语法
|
Package syntax 负责处理路由语法 |
tree
Package tree 提供了以树形结构保存路由项的相关操作
|
Package tree 提供了以树形结构保存路由项的相关操作 |
Package routertest 提供针对路由的测试用例
|
Package routertest 提供针对路由的测试用例 |
Package types 类型的前置声明
|
Package types 类型的前置声明 |