mux

package module
v1.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 14, 2018 License: MIT Imports: 8 Imported by: 2

README

mux Build Status Go version Go Report Card codecov

mux 是一个实现了 http.Handler 的中间件,为用户提供了以下功能:

  1. 正则路由;
  2. 路由参数;
  3. 丰富的 OPTIONS 请求处理方式;
  4. 根据路由生成地址。
中间件

mux 本身就是一个实现了 http.Handler 接口的中间件, 所有实现官方接口 http.Handler 的都可以附加到 mux 上作为中间件使用。

middleware 提供了诸如按域名过滤等常用的中间件功能。

m := mux.New(false, false, nil, nil).
    Get("/users/1", h).             // GET /user/1
    Post("/login", h).              // POST /api/login
    Get("/posts/{id:\\d+}", h).     // GET /blog/post/{id:\\d+} 正则路由
    Options("/users/1", "GET")      // OPTIONS /user/1 手动指定该路由项的 OPTIONS 请求方法返回内容

// 统一前缀路径的路由
p := m.Prefix("/api")
p.Get("/logout", h) // 相当于 m.Get("/api/logout", h)
p.Post("/login", h) // 相当于 m.Get("/api/login", h)

// 对同一资源的不同操作
res := p.Resource("/users/{id:\\d+}")
res.Get(h)   // 相当于 m.Get("/api/users/{id:\\d+}", h)
res.Post(h)  // 相当于 m.Post("/api/users/{id:\\d+}", h)
res.URL(map[string]string{"id": "5"}) // 构建一条基于此路由项的路径:/users/5

http.ListenAndServe(":8080", m)
安装
go get github.com/issue9/mux
文档

Go Walker GoDoc

版权

本项目采用 MIT 开源授权许可证,完整的授权说明可在 LICENSE 文件中找到。

Documentation

Overview

Package mux 是一个提供了路由匹配功能的中间件。

m := mux.New(false, false, nil, nil).
    Get("/users/1", h).
    Post("/login", h).
    Get("/posts/{id:\\d+}", h).  // 正则路由
    Options("/users/1", "GET")   // 手动指定 OPTIONS 请求的返回内容。

// 统一前缀路径的路由
p := m.Prefix("/api")
p.Get("/logout", h) // 相当于 m.Get("/api/logout", h)
p.Post("/login", h) // 相当于 m.Get("/api/login", h)

// 对同一资源的不同操作
res := p.Resource("/users/{id\\d+}")
res.Get(h)   // 相当于 m.Get("/api/users/{id}", h)
res.Post(h)  // 相当于 m.Post("/api/users/{id}", h)
res.URL(map[string]string{"id": "5"}) // 生成 /users/5

http.ListenAndServe(":8080", m)

正则表达式

路由中支持以正则表达式的方式进行匹配,表达式以大括号包含,内部以冒号分隔, 前半部分为变量的名称,后半部分为变量可匹配类型的正则表达式。比如:

/posts/{id:\\d+} // 将被转换成 /posts/(?P<id>\\d+)
/posts/{:\\d+}   // 将被转换成 /posts/\\d+

命名参数

若路由字符串中,所有的正则表达式都只有名称部分(没有冒号及之后的内容), 则会被转换成命名参数,因为不需要作正则验证,性能会比较正则稍微好上一些。 命名参数匹配所有字符。

/posts/{id}.html                  // 匹配 /posts/1.html
/posts-{id}-{page}.html           // 匹配 /posts-1-10.html

通配符

在路由字符串中若是以命名参数结尾的,则表示可以匹配之后的任意字符。

/blog/assets/{path}
/blog/{tags:\\w+}/{path}
/blog/assets{path}

路径匹配规则

可能会出现多条记录与同一请求都匹配的情况,这种情况下, 系统会找到一条认为最匹配的路由来处理,判断规则如下:

  1. 普通路由优先于正则路由;
  2. 正则路由优先于命名路由;

比如:

/posts/{id}.html              // 1
/posts/{id:\\d+}.html         // 2
/posts/1.html                 // 3

/posts/1.html      // 匹配 3
/posts/11.html     // 匹配 2
/posts/index.html  // 匹配 1

路由参数

通过正则表达式匹配的路由,其中带命名的参数可通过 GetParams() 获取:

params := GetParams(r)

id, err := params.Int("id")
// 或是
id := params.MustInt("id", 0) // 0 表示在无法获取 id 参数的默认值

OPTIONS

默认情况下,用户无须显示地实现它,系统会自动实现。 当然用户也可以使用 *.Options() 函数指定特定的数据; 或是直接使用 *.Handle() 指定一个自定义的实现方式。

如果不需要的话,也可以在 New() 中将 disableOptions 设置为 true。 显示设定 OPTIONS,不受 disableOptions 的影响。

m := mux.New(...)
m.Get("/posts/{id}", nil)     // 默认情况下, OPTIONS 的报头为 GET, OPTIONS
m.Options("/posts/{id}", "*") // 强制改成 *
m.Delete("/posts/{id}", nil)  // OPTIONS 依然为 *

m.Remove("/posts/{id}", http.MethodOptions)    // 在当前路由上禁用 OPTIONS
m.Handle("/posts/{id}", h, http.MethodOptions) // 显示指定一个处理函数 h

适用范围

由于路由项采用了切片(slice) 的形式保存路由项, 如果在运行过程中需要大量的增删路由操作,性能上会比较差, 建议使用其它的库的代替。其它情况下,性能还是不错的, 具体的可运行 `go test -bench=.` 查看。

Index

Constants

This section is empty.

Variables

View Source
var ErrNameExists = errors.New("存在相同名称的路由项")

ErrNameExists 当为一个路由项命名时,若存在相同名称的,则返回此错误信息。

Functions

func Params

func Params(r *http.Request) params.Params

Params 获取路由的参数集合。详细情况可参考 params.Get

Types

type Mux

type Mux struct {
	// contains filtered or unexported fields
}

Mux 提供了强大的路由匹配功能,可以对路径按正则或是请求方法进行匹配。

用法如下:

m := mux.New()
m.Get("/abc/h1", h1).
  Post("/abc/h2", h2).
  Handle("/api/{version:\\d+}",h3, http.MethodGet, http.MethodPost) // 只匹配 GET 和 POST
http.ListenAndServe(m)

func New

func New(disableOptions, skipCleanPath bool, notFound, methodNotAllowed http.HandlerFunc) *Mux

New 声明一个新的 Mux。

disableOptions 是否禁用自动生成 OPTIONS 功能; skipCleanPath 是否不对访问路径作处理,比如 "//api" ==> "/api"; notFound 404 页面的处理方式,为 nil 时会调用默认的方式进行处理; methodNotAllowed 405 页面的处理方式,为 nil 时会调用默认的方式进行处理, 调用此方法前,会设置 Allow 报头,如果不需要,则要在 methodNotAllowed 中去掉。

func (*Mux) AddMiddlewares deprecated added in v1.1.0

func (mux *Mux) AddMiddlewares(m ...middleware.Middleware) *Mux

AddMiddlewares 添加中间件,可多次调用。

Deprecated: 采用 AppendMiddlewares 代替

func (*Mux) Any

func (mux *Mux) Any(pattern string, h http.Handler) *Mux

Any 相当于 Mux.Handle(pattern, h) 的简易写法

func (*Mux) AnyFunc

func (mux *Mux) AnyFunc(pattern string, fun http.HandlerFunc) *Mux

AnyFunc 相当于 Mux.HandleFunc(pattern, func) 的简易写法

func (*Mux) AppendMiddlewares added in v1.2.0

func (mux *Mux) AppendMiddlewares(m ...middleware.Middleware) *Mux

AppendMiddlewares 添加中间件,可多次调用。

func (*Mux) Clean

func (mux *Mux) Clean() *Mux

Clean 清除所有的路由项

func (*Mux) Delete

func (mux *Mux) Delete(pattern string, h http.Handler) *Mux

Delete 相当于 Mux.Handle(pattern, h, http.MethodDelete) 的简易写法

func (*Mux) DeleteFunc

func (mux *Mux) DeleteFunc(pattern string, fun http.HandlerFunc) *Mux

DeleteFunc 相当于 Mux.HandleFunc(pattern, func, http.MethodDelete) 的简易写法

func (*Mux) Get

func (mux *Mux) Get(pattern string, h http.Handler) *Mux

Get 相当于 Mux.Handle(pattern, h, http.MethodGet) 的简易写法

func (*Mux) GetFunc

func (mux *Mux) GetFunc(pattern string, fun http.HandlerFunc) *Mux

GetFunc 相当于 Mux.HandleFunc(pattern, func, http.MethodGet) 的简易写法

func (*Mux) Handle

func (mux *Mux) Handle(pattern string, h http.Handler, methods ...string) error

Handle 添加一条路由数据。

pattern 为路由匹配模式,可以是正则匹配也可以是字符串匹配; methods 该路由项对应的请求方法,可通过 SupportedMethods() 获得当前支持的请求方法。

func (*Mux) HandleFunc

func (mux *Mux) HandleFunc(pattern string, fun http.HandlerFunc, methods ...string) error

HandleFunc 功能同 Mux.Handle(),但是将第二个参数从 http.Handler 换成了 http.HandlerFunc

func (*Mux) Name

func (mux *Mux) Name(name, pattern string) error

Name 为一条路由项命名。 URL 可以通过此属性来生成地址。

func (*Mux) Options

func (mux *Mux) Options(pattern string, allow string) *Mux

Options 将 OPTIONS 请求方法的报头 allow 值固定为指定的值。

若无特殊需求,不用调用此方法,系统会自动计算符合当前路由的请求方法列表。 如果想实现对处理方法的自定义,可以显示地调用 Handle 方法:

Mux.Handle("/api/1", handle, http.MethodOptions)

func (*Mux) Patch

func (mux *Mux) Patch(pattern string, h http.Handler) *Mux

Patch 相当于 Mux.Handle(pattern, h, http.MethodPatch) 的简易写法

func (*Mux) PatchFunc

func (mux *Mux) PatchFunc(pattern string, fun http.HandlerFunc) *Mux

PatchFunc 相当于 Mux.HandleFunc(pattern, func, http.MethodPatch) 的简易写法

func (*Mux) Post

func (mux *Mux) Post(pattern string, h http.Handler) *Mux

Post 相当于 Mux.Handle(pattern, h, http.MethodPost) 的简易写法

func (*Mux) PostFunc

func (mux *Mux) PostFunc(pattern string, fun http.HandlerFunc) *Mux

PostFunc 相当于 Mux.HandleFunc(pattern, func, "POST") 的简易写法

func (*Mux) Prefix

func (mux *Mux) Prefix(prefix string) *Prefix

Prefix 声明一个 Prefix 实例。

func (*Mux) Put

func (mux *Mux) Put(pattern string, h http.Handler) *Mux

Put 相当于 Mux.Handle(pattern, h, http.MethodPut) 的简易写法

func (*Mux) PutFunc

func (mux *Mux) PutFunc(pattern string, fun http.HandlerFunc) *Mux

PutFunc 相当于 Mux.HandleFunc(pattern, func, http.MethodPut) 的简易写法

func (*Mux) Remove

func (mux *Mux) Remove(pattern string, methods ...string) *Mux

Remove 移除指定的路由项。

当未指定 methods 时,将删除所有 method 匹配的项。 指定错误的 methods 值,将自动忽略该值。

func (*Mux) ResetMiddlewares added in v1.1.0

func (mux *Mux) ResetMiddlewares() *Mux

ResetMiddlewares 清除中间件。

func (*Mux) Resource

func (mux *Mux) Resource(pattern string) *Resource

Resource 创建一个资源路由项。

func (*Mux) ServeHTTP

func (mux *Mux) ServeHTTP(w http.ResponseWriter, r *http.Request)

func (*Mux) URL

func (mux *Mux) URL(name string, params map[string]string) (string, error)

URL 根据参数生成地址。 name 为路由的名称,或是直接为路由项的定义内容; params 为路由项中的参数,键名为参数名,键值为参数值。

func (*Mux) UnshiftMiddlewares added in v1.2.0

func (mux *Mux) UnshiftMiddlewares(m ...middleware.Middleware) *Mux

UnshiftMiddlewares 前排插入中间件。可多次调用

type Prefix

type Prefix struct {
	// contains filtered or unexported fields
}

Prefix 可以将具有统一前缀的路由项集中在一起操作。

p := srv.Prefix("/api")
p.Get("/users")  // 相当于 srv.Get("/api/users")
p.Get("/user/1") // 相当于 srv.Get("/api/user/1")

func (*Prefix) Any

func (p *Prefix) Any(pattern string, h http.Handler) *Prefix

Any 相当于 Mux.Any(prefix+pattern, h) 的简易写法

func (*Prefix) AnyFunc

func (p *Prefix) AnyFunc(pattern string, fun http.HandlerFunc) *Prefix

AnyFunc 相当于 Mux.AnyFunc(prefix+pattern, func) 的简易写法

func (*Prefix) Clean

func (p *Prefix) Clean() *Prefix

Clean 清除所有以 Prefix.prefix 开头的 Entry。

当指定多个相同的 Prefix 时,调用其中的一个 Clean 也将会清除其它的:

p1 := mux.Prefix("prefix")
p2 := mux.Prefix("prefix")
p2.Clean() 将同时清除 p1 的内容,因为有相同的前缀。

func (*Prefix) Delete

func (p *Prefix) Delete(pattern string, h http.Handler) *Prefix

Delete 相当于 Mux.Delete(prefix+pattern, h)的简易写法

func (*Prefix) DeleteFunc

func (p *Prefix) DeleteFunc(pattern string, fun http.HandlerFunc) *Prefix

DeleteFunc 相当于 Mux.DeleteFunc(prefix+pattern, func) 的简易写法

func (*Prefix) Get

func (p *Prefix) Get(pattern string, h http.Handler) *Prefix

Get 相当于 Mux.Get(prefix+pattern, h) 的简易写法

func (*Prefix) GetFunc

func (p *Prefix) GetFunc(pattern string, fun http.HandlerFunc) *Prefix

GetFunc 相当于 Mux.GetFunc(prefix+pattern, func) 的简易写法

func (*Prefix) Handle

func (p *Prefix) Handle(pattern string, h http.Handler, methods ...string) error

Handle 相当于 Mux.Handle(prefix+pattern, h, methods...) 的简易写法

func (*Prefix) HandleFunc

func (p *Prefix) HandleFunc(pattern string, fun http.HandlerFunc, methods ...string) error

HandleFunc 功能同 Mux.HandleFunc(prefix+pattern, fun, ...)

func (*Prefix) Mux

func (p *Prefix) Mux() *Mux

Mux 返回与当前关联的 *Mux 实例

func (*Prefix) Name

func (p *Prefix) Name(name, pattern string) error

Name 为一条路由项命名。 URL 可以通过此属性来生成地址。

func (*Prefix) Options

func (p *Prefix) Options(pattern string, allow string) *Prefix

Options 手动指定 OPTIONS 请求方法的值。具体说明可参考 Mux.Options 方法。

func (*Prefix) Patch

func (p *Prefix) Patch(pattern string, h http.Handler) *Prefix

Patch 相当于 Mux.Patch(prefix+pattern, h) 的简易写法

func (*Prefix) PatchFunc

func (p *Prefix) PatchFunc(pattern string, fun http.HandlerFunc) *Prefix

PatchFunc 相当于 Mux.PatchFunc(prefix+pattern, func) 的简易写法

func (*Prefix) Post

func (p *Prefix) Post(pattern string, h http.Handler) *Prefix

Post 相当于 Mux.Post(prefix+pattern, h) 的简易写法

func (*Prefix) PostFunc

func (p *Prefix) PostFunc(pattern string, fun http.HandlerFunc) *Prefix

PostFunc 相当 于Mux.PostFunc(prefix+pattern, func) 的简易写法

func (*Prefix) Prefix

func (p *Prefix) Prefix(prefix string) *Prefix

Prefix 在现在有 Prefix 的基础上声明一个新的 Prefix 实例。

p := mux.Prefix("/api")
v := p.Prefix("/v2")
v.Get("/users")  // 相当于 g.Get("/api/v2/users")
v.Get("/user/1") // 相当于 g.Get("/api/v2/user/1")

func (*Prefix) Put

func (p *Prefix) Put(pattern string, h http.Handler) *Prefix

Put 相当于 Mux.Put(prefix+pattern, h) 的简易写法

func (*Prefix) PutFunc

func (p *Prefix) PutFunc(pattern string, fun http.HandlerFunc) *Prefix

PutFunc 相当于 Mux.PutFunc(prefix+pattern, func) 的简易写法

func (*Prefix) Remove

func (p *Prefix) Remove(pattern string, methods ...string) *Prefix

Remove 删除指定匹配模式的路由项

func (*Prefix) Resource

func (p *Prefix) Resource(pattern string) *Resource

Resource 创建一个资源路由项。

func (*Prefix) URL

func (p *Prefix) URL(name string, params map[string]string) (string, error)

URL 根据参数生成地址。 name 为路由的名称,或是直接为路由项的定义内容, 若 name 作为路由项定义,会加上 Prefix.prefix 作为前缀; params 为路由项中的参数,键名为参数名,键值为参数值。

type Resource

type Resource struct {
	// contains filtered or unexported fields
}

Resource 以资源地址为对象的路由配置。

r, _ := srv.Resource("/api/users/{id}")
r.Get(h)  // 相当于 srv.Get("/api/users/{id}")
r.Post(h) // 相当于 srv.Post("/api/users/{id}")
url := r.URL(map[string]string{"id":5}) // 获得 /api/users/5

func (*Resource) Any

func (r *Resource) Any(h http.Handler) *Resource

Any 相当于 Mux.Any(pattern, h) 的简易写法

func (*Resource) AnyFunc

func (r *Resource) AnyFunc(fun http.HandlerFunc) *Resource

AnyFunc 相当于 Mux.AnyFunc(pattern, func) 的简易写法

func (*Resource) Clean

func (r *Resource) Clean() *Resource

Clean 清除当前资源的所有路由项

func (*Resource) Delete

func (r *Resource) Delete(h http.Handler) *Resource

Delete 相当于 Mux.Delete(pattern, h) 的简易写法

func (*Resource) DeleteFunc

func (r *Resource) DeleteFunc(fun http.HandlerFunc) *Resource

DeleteFunc 相当于 Mux.DeleteFunc(pattern, func) 的简易写法

func (*Resource) Get

func (r *Resource) Get(h http.Handler) *Resource

Get 相当于 Mux.Get(pattern, h) 的简易写法

func (*Resource) GetFunc

func (r *Resource) GetFunc(fun http.HandlerFunc) *Resource

GetFunc 相当于 Mux.GetFunc(pattern, func) 的简易写法

func (*Resource) Handle

func (r *Resource) Handle(h http.Handler, methods ...string) error

Handle 相当于 Mux.Handle(pattern, h, methods...) 的简易写法

func (*Resource) HandleFunc

func (r *Resource) HandleFunc(fun http.HandlerFunc, methods ...string) error

HandleFunc 功能同 Mux.HandleFunc(pattern, fun, ...)

func (*Resource) Mux

func (r *Resource) Mux() *Mux

Mux 返回与当前资源关联的 *Mux 实例

func (*Resource) Name

func (r *Resource) Name(name string) error

Name 为一条路由项命名。 URL 可以通过此属性来生成地址。

func (*Resource) Options

func (r *Resource) Options(allow string) *Resource

Options 手动指定 OPTIONS 请求方法的值。具体说明可参考 Mux.Options 方法。

func (*Resource) Patch

func (r *Resource) Patch(h http.Handler) *Resource

Patch 相当于 Mux.Patch(pattern, h) 的简易写法

func (*Resource) PatchFunc

func (r *Resource) PatchFunc(fun http.HandlerFunc) *Resource

PatchFunc 相当于 Mux.PatchFunc(pattern, func) 的简易写法

func (*Resource) Post

func (r *Resource) Post(h http.Handler) *Resource

Post 相当于 Mux.Post(pattern, h) 的简易写法

func (*Resource) PostFunc

func (r *Resource) PostFunc(fun http.HandlerFunc) *Resource

PostFunc 相当于 Mux.PostFunc(pattern, func) 的简易写法

func (*Resource) Put

func (r *Resource) Put(h http.Handler) *Resource

Put 相当于 Mux.Put(pattern, h) 的简易写法

func (*Resource) PutFunc

func (r *Resource) PutFunc(fun http.HandlerFunc) *Resource

PutFunc 相当于 Mux.PutFunc(pattern, func) 的简易写法

func (*Resource) Remove

func (r *Resource) Remove(methods ...string) *Resource

Remove 删除指定匹配模式的路由项

func (*Resource) URL

func (r *Resource) URL(params map[string]string) (string, error)

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

Directories

Path Synopsis
internal
handlers
Package handlers 用于处理节点下与处理函数相关的逻辑
Package handlers 用于处理节点下与处理函数相关的逻辑
tree
Package tree 提供了以树形结构保存路由项的相关操作。
Package tree 提供了以树形结构保存路由项的相关操作。
Package params 获取和转换路由中的参数信息。
Package params 获取和转换路由中的参数信息。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL