mux

package module
v5.5.0 Latest Latest
Warning

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

Go to latest
Published: Jan 6, 2022 License: MIT Imports: 20 Imported by: 2

README

mux

Go Go version Go Report Card license codecov PkgGoDev

mux 功能完备的 Go 路由器:

  • 路由参数;
  • 支持正则表达式作为路由项匹配方式;
  • 拦截正则表达式的行为;
  • 自动生成 OPTIONS 请求处理方式;
  • 自动生成 HEAD 请求处理方式;
  • 根据路由反向生成地址;
  • 任意风格的路由,比如 discuz 这种不以 / 作为分隔符的;
  • 分组路由,比如按域名,或是版本号等;
  • CORS 跨域资源的处理;
  • 支持中间件;
  • 自动生成 OPTIONS * 请求;
  • 静态文件系统;
  • Trace 请求方法的支持;
  • panic 处理;
import "github.com/issue9/middleware/v4/compress"
import "github.com/issue9/mux/v5"

c := compress.New()

router := mux.NewRouter("")
router.Middlewares().Append(c)
router.Get("/users/1", h).
    Post("/login", h).
    Get("/pages/{id:\\d+}.html", h). // 匹配 /pages/123.html 等格式,path = 123
    Get("/posts/{path}.html", h).    // 匹配 /posts/2020/11/11/title.html 等格式,path = 2020/11/11/title

// 统一前缀路径的路由
p := router.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", 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
路径匹配规则

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

  1. 普通路由优先于正则路由;
  2. 拦截器优先于正则路由;
  3. 正则路由优先于命名路由;

比如:

/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

路径的匹配是以从左到右的顺序进行的,父节点不会因为没有子节点匹配而扩大自己的匹配范围, 比如 /posts/{id}-{page:digit}.html 可以匹配 /posts/1-1.html,但无法匹配 /posts/1-1-1.html,虽然理论上 1-1- 也能匹配 {id},但是 1- 已经优先匹配了, 在子元素找不到的情况下,并不会将父元素的匹配范围扩大到 1-1-

路由参数

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

import "github.com/issue9/mux/v5"

params := mux.GetParams(r)

id, err := params.Int("id")
 // 或是
id := params.MustInt("id", 0) // 在无法获取 id 参数时采用 0 作为默认值返回

高级用法

分组路由

可以通过匹配 group.Matcher 接口,定义了一组特定要求的路由项。

// server.go

import "github.com/issue9/mux/v5"
import "github.com/issue9/mux/v5/group"

m := group.New()

def := mux.NewRouter("default")
m.AddRouter(group.NewPathVersion("version-key", "v1"), def)
def.Get("/path", h1)

host := mux.NewRouter("host")
m.AddRouter(group.NewHosts("*.example.com"), host)
host.Get("/path", h2)

http.ListenAndServe(":8080", m)

// client.go

// 访问 h2 的内容
r := http.NewRequest(http.MethodGet, "https://abc.example.com/path", nil)
r.Do()

// 访问 h1 的内容
r := http.NewRequest(http.MethodGet, "https://other_domain.com/v1/path", nil)
r.Do()
拦截器

正常情况下,/posts/{id:\d+} 或是 /posts/{id:[0-9]+} 会被当作正则表达式处理, 但是正则表达式的性能并不是很好,这个时候我们可以通过在 NewRouter 传递 Interceptor 进行拦截:

import "github.com/issue9/mux/v5"

func digit(path string) bool {
    for _, c := range path {
        if c < '0' || c > '9' {
            return false
        }
    }
    return len(path) > 0
}

// 路由中的 \d+ 和 [0-9]+ 均采用 digit 函数进行处理,不再是正则表达式。
r := mux.NewRouter("", mux.Interceptor(digit, "\\d+", "[0-9]+"))

这样在所有路由项中的 [0-9]+\\d+ 将由 digit 函数处理, 不再会被编译为正则表达式,在性能上会有很大的提升。 通过该功能,也可以自定义一些非正常的正则表达这式,然后进行拦截,比如:

/posts/{id:digit}/.html

如果不拦截,最终传递给正则表达式,可能会出现编译错误,通过拦截器可以将 digit 合法化。 目前提供了以下几个拦截器:

  • InterceptorDigit 限定为数字字符,相当于正则的 [0-9]
  • InterceptorWord 相当于正则的 [a-zA-Z0-9]
  • InterceptorAny 表示匹配任意非空内容;

用户也可以自行实现 InterceptorFunc 作为拦截器。具体可参考 https://pkg.go.dev/github.com/issue9/mux/v5#Interceptor

CORS

CORS 不再是以中间件的形式提供,而是通过 NewRouter 直接传递有关 CORS 的配置信息, 这样可以更好地处理每个地址支持的请求方法。

OPTIONS 请求方法由系统自动生成。

import "github.com/issue9/mux/v5"

r := mux.NewRouter("name" ,AllowedCORS) // 任意跨域请求

r.Get("/posts/{id}", nil)     // 默认情况下, OPTIONS 的报头为 GET, OPTIONS

http.ListenAndServe(":8080", m)

// client.go

// 访问 h2 的内容
r := http.NewRequest(http.MethodGet, "https://localhost:8080/posts/1", nil)
r.Header.Set("Origin", "https://example.com")
r.Do() // 跨域,可以正常访问


r = http.NewRequest(http.MethodOptions, "https://localhost:8080/posts/1", nil)
r.Header.Set("Origin", "https://example.com")
r.Header.Set("Access-Control-Request-Method", "GET")
r.Do() // 预检请求,可以正常访问
静态文件

可以使用 FileServer 与命名参数相结合的方式实现静态文件的访问:

r := NewRouter("")
r.Get("/assets/{path}", FileServer(os.DirFS("/static/"), "path", "index.html", nil))
中间件

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

mux 本身也提供了对中间件的管理功能,同时 middleware 提供了常用的中间件功能。

import "github.com/issue9/middleware/v4/compress"

c := compress.New(log.Default(), "*")

r := mux.NewRouter("")

// 添加中间件
r.Middlewares().Append(c.Middleware)

性能

https://caixw.github.io/go-http-routers-testing/ 提供了与其它几个框架的对比情况。

版权

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

Documentation

Overview

Package mux 功能完备的路由中间件

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AllowedCORS

func AllowedCORS(o *options.Options)

AllowedCORS 允许跨域请求

NOTE: AllowedCORS 与 CORS 会相互覆盖。

func ApplyMiddlewares

func ApplyMiddlewares(h http.Handler, f ...MiddlewareFunc) http.Handler

func ApplyMiddlewaresFunc

func ApplyMiddlewaresFunc(h func(w http.ResponseWriter, r *http.Request), f ...MiddlewareFunc) http.Handler

func CaseInsensitive

func CaseInsensitive(o *options.Options)

CaseInsensitive 忽略大小写

该操作仅是将客户端的请求路径转换为小之后再次进行匹配, 如果服务端的路由项设置为大写,则依然是不匹配的。

func CheckSyntax

func CheckSyntax(pattern string) error

CheckSyntax 检测路由项的语法格式

路由中可通过 {} 指定参数名称,如果参数名中带 :,则 : 之后的为参数的约束条件, 比如 /posts/{id}.html 表示匹配任意任意字符的参数 id。/posts/{id:\d+}.html, 表示匹配正则表达式 \d+ 的参数 id。

func FileServer added in v5.2.0

func FileServer(fsys http.FileSystem, name, index string, errHandler func(http.ResponseWriter, int, interface{})) http.Handler

FileServer 声明静态文件服务

fsys 访问的文件系统; name 路径保存在 context 中的参数名; index 当用户访问的是目录时,将自动读取此目录下的 index 文件,如果为空则为 index.html; errHandler 对各类出错的处理,如果为空会调用 http.Error 进行相应的处理。 如果要自定义,目前 status 可能的值有 403、404 和 500, 其中的 500 用于处理各类出错的情况,错误信息通过 msg 传递; 函数原型为:

func(w http.ResponseWriter, status int, msg interface{})

status 表示输出的状态码,msg 表示额外的信息,一般为空或是 error 类型的数据。 返回对象同时实现了 http.FileSystem 接口;

r := NewRouter("")
r.Get("/assets/{path}", FileServer(http.Dir("./assets"), "path", "index.html", nil)

func InterceptorAny

func InterceptorAny(rule string) bool

InterceptorAny 任意非空字符的拦截器

func InterceptorDigit

func InterceptorDigit(rule string) bool

InterceptorDigit 任意数字字符的拦截器

func InterceptorWord

func InterceptorWord(rule string) bool

InterceptorWord 任意英文单词的拦截器

func Lock

func Lock(o *options.Options)

Lock 是否加锁

在调用 Router.Add 添加路由时,有可能会改变整个路由树的结构, 如果需要频繁在运行时添加和删除路由项,那么应当添加此选项。

func Methods

func Methods() []string

Methods 返回所有支持的请求方法

func Trace added in v5.5.0

func Trace(body bool, log *log.Logger) http.Handler

Trace 简单的 Trace 请求方法实现

NOTE: 并不是百分百原样返回,具体可参考 net/http/httputil.DumpRequest 的说明。 如果内容包含特殊的 HTML 字符会被 html.EscapeString 转码。

func URL added in v5.1.0

func URL(pattern string, params map[string]string) (string, error)

URL 根据参数生成地址

pattern 为路由项的定义内容; params 为路由项中的参数,键名为参数名,键值为参数值。

NOTE: 仅仅是将 params 填入到 pattern 中, 不会判断参数格式是否正确。

Types

type InterceptorFunc

type InterceptorFunc = syntax.InterceptorFunc

InterceptorFunc 拦截器的函数原型

type MiddlewareFunc

type MiddlewareFunc = middleware.Func

type Middlewares

type Middlewares = middleware.Middlewares

func NewMiddlewares

func NewMiddlewares(next http.Handler) *Middlewares

NewMiddlewares 声明新的 Middlewares 实例

type Option

type Option = options.Option

Option 自定义路由参数的函数原型

func CORS

func CORS(origins, allowHeaders, exposedHeaders []string, maxAge int, allowCredentials bool) Option

CORS 自定义跨域请求设置项

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/cors

origins 对应 Origin 报头。如果包含了 *,那么其它的设置将不再启作用。 如果此值为空,表示不启用跨域的相关设置;

allowHeaders 对应 Access-Control-Allow-Headers 可以包含 *,表示可以是任意值,其它值将不再启作用;

exposedHeaders 对应 Access-Control-Expose-Headers

maxAge 对应 Access-Control-Max-Age 有以下几种取值: 0 不输出该报头; -1 表示禁用; 其它 >= -1 的值正常输出数值;

allowCredentials 对应 Access-Control-Allow-Credentials。

NOTE: AllowedCORS 与 CORS 会相互覆盖。

func HTTPRecovery added in v5.3.0

func HTTPRecovery(status int) Option

HTTPRecovery 仅向客户端输出 status 状态码

func Interceptor

func Interceptor(f InterceptorFunc, name ...string) Option

Interceptor 针对带参数类型路由的拦截处理

在解析诸如 /authors/{id:\\d+} 带参数的路由项时, 用户可以通过拦截并自定义对参数部分 {id:\\d+} 的解析, 从而不需要走正则表达式的那一套解析流程,可以在一定程度上增强性能。

一旦正则表达式被拦截,则节点类型也将不再是正则表达式, 其处理优先级会比正则表达式类型高。 在某些情况下,可能会造成处理结果不相同。比如:

/authors/{id:\\d+}     // 1
/authors/{id:[0-9]+}   // 2

以上两条记录是相同的,但因为表达式不同,也能正常添加, 处理流程,会按添加顺序优先比对第一条,所以第二条是永远无法匹配的。 但是如果你此时添加了 Interceptor(InterceptorDigit, "[0-9]+"), 使第二个记录的优先级提升,会使第一条永远无法匹配到数据。

func LogRecovery added in v5.3.0

func LogRecovery(status int, l *log.Logger) Option

LogRecovery 将错误信息输出到日志

status 表示向客户端输出的状态码; l 为输出的日志;

func MethodNotAllowed

func MethodNotAllowed(h http.Handler) Option

MethodNotAllowed 自定义 405 状态码下的输出

在 405 状态码下,除了输出用户指定的输出内容之外,系统还会输出 Allow 报头。

func NotFound

func NotFound(h http.Handler) Option

NotFound 自定义 404 状态码下的输出

func Recovery added in v5.3.0

func Recovery(f RecoverFunc) Option

Recovery 用于指路由 panic 之后的处理方法

除了采用 Option 的方式之外,也可以使用中间件的方式处理 panic, 但是中间件的处理方式需要用户保证其在中间件的最外层, 否则可能会发生其外层的中间件发生 panic 无法捕获的问题。 而 Option 方式没有此问题。

func URLDomain added in v5.1.0

func URLDomain(domain string) Option

URLDomain 为 Router.URL 生成的地址带上域名

func WriterRecovery added in v5.3.0

func WriterRecovery(status int, out io.Writer) Option

WriterRecovery 向 io.Writer 输出错误信息

status 表示向客户端输出的状态码; out 输出的 io.Writer,比如 os.Stderr 等;

type Params

type Params = params.Params

Params 路由参数

func GetParams

func GetParams(r *http.Request) Params

GetParams 获取路由中的参数集合

type Prefix

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

Prefix 操纵统一前缀的路由

example: r := NewRouter("")

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

func (*Prefix) Any

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

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

func (*Prefix) AnyFunc

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

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

func (*Prefix) Clean

func (p *Prefix) Clean()

Clean 清除所有以 Prefix.prefix 开头的路由项

当指定多个相同的 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 相当于 Router.Delete(prefix+pattern, h)的简易写法

func (*Prefix) DeleteFunc

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

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

func (*Prefix) Get

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

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

func (*Prefix) GetFunc

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

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

func (*Prefix) Handle

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

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

func (*Prefix) HandleFunc

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

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

func (*Prefix) Patch

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

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

func (*Prefix) PatchFunc

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

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

func (*Prefix) Post

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

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

func (*Prefix) PostFunc

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

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

func (*Prefix) Prefix

func (p *Prefix) Prefix(prefix string, m ...middleware.Func) *Prefix

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

m 中间件函数,按顺序调用,会继承 p 的中间件并按在 m 之前;

example:

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

func (*Prefix) Put

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

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

func (*Prefix) PutFunc

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

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

func (*Prefix) Remove

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

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

func (*Prefix) Resource

func (p *Prefix) Resource(pattern string, m ...middleware.Func) *Resource

Resource 创建一个资源路由项

pattern 资源地址; m 中间件函数,按顺序调用,会继承 p 的中间件并按在 m 之前;

func (*Prefix) Router

func (p *Prefix) Router() *Router

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

func (*Prefix) URL

func (p *Prefix) URL(strict bool, pattern string, params map[string]string) (string, error)

URL 根据参数生成地址

name 为路由的名称,或是直接为路由项的定义内容, 若 name 作为路由项定义,会加上 Prefix.prefix 作为前缀;

type RecoverFunc added in v5.3.0

type RecoverFunc = options.RecoverFunc

RecoverFunc 路由对 panic 的处理函数原型

type Resource

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

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

srv := NewRouter("")
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 相当于 Router.Any(pattern, h) 的简易写法

func (*Resource) AnyFunc

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

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

func (*Resource) Clean

func (r *Resource) Clean()

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

func (*Resource) Delete

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

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

func (*Resource) DeleteFunc

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

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

func (*Resource) Get

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

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

func (*Resource) GetFunc

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

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

func (*Resource) Handle

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

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

func (*Resource) HandleFunc

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

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

func (*Resource) Patch

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

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

func (*Resource) PatchFunc

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

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

func (*Resource) Post

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

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

func (*Resource) PostFunc

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

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

func (*Resource) Put

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

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

func (*Resource) PutFunc

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

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

func (*Resource) Remove

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

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

func (*Resource) Router

func (r *Resource) Router() *Router

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

func (*Resource) URL

func (r *Resource) URL(strict bool, 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

type Router

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

Router 路由

可以对路径按正则或是请求方法进行匹配。用法如下:

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

如果需要同时对多个 Router 实例进行路由,可以采用 group.Group 对象管理多个 Router 实例。

func NewRouter

func NewRouter(name string, o ...Option) *Router

NewRouter 声明路由

name string 路由名称,可以为空;

o 修改路由的默认形为。比如 CaseInsensitive 会让路由忽略大小写, 相同类型的函数会相互覆盖,比如 CORS 和 AllowedCORS,后传递会覆盖前传递的值。

func (*Router) Any

func (r *Router) Any(pattern string, h http.Handler) *Router

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

func (*Router) AnyFunc

func (r *Router) AnyFunc(pattern string, f http.HandlerFunc) *Router

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

func (*Router) Clean

func (r *Router) Clean()

Clean 清除当前路由组的所有路由项

func (*Router) Delete

func (r *Router) Delete(pattern string, h http.Handler) *Router

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

func (*Router) DeleteFunc

func (r *Router) DeleteFunc(pattern string, f http.HandlerFunc) *Router

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

func (*Router) Get

func (r *Router) Get(pattern string, h http.Handler) *Router

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

h 不应该主动调用 WriteHeader,否则会导致 HEAD 请求获取不到 Content-Length 报头。

func (*Router) GetFunc

func (r *Router) GetFunc(pattern string, f http.HandlerFunc) *Router

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

func (*Router) Handle

func (r *Router) Handle(pattern string, h http.Handler, methods ...string) *Router

Handle 添加一条路由数据

pattern 为路由匹配模式,可以是正则匹配也可以是字符串匹配, 若语法不正确,则直接 panic,可以通过 CheckSyntax 检测语法的有效性,其它接口也相同。 methods 该路由项对应的请求方法,如果未指定值,则表示所有支持的请求方法, 但不包含 OPTIONS 和 HEAD。

func (*Router) HandleFunc

func (r *Router) HandleFunc(pattern string, f http.HandlerFunc, methods ...string) *Router

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

func (*Router) Middlewares

func (r *Router) Middlewares() *Middlewares

Middlewares 返回中间件管理接口

func (*Router) Name

func (r *Router) Name() string

Name 路由名称

func (*Router) Patch

func (r *Router) Patch(pattern string, h http.Handler) *Router

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

func (*Router) PatchFunc

func (r *Router) PatchFunc(pattern string, f http.HandlerFunc) *Router

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

func (*Router) Post

func (r *Router) Post(pattern string, h http.Handler) *Router

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

func (*Router) PostFunc

func (r *Router) PostFunc(pattern string, f http.HandlerFunc) *Router

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

func (*Router) Prefix

func (r *Router) Prefix(prefix string, m ...middleware.Func) *Prefix

Prefix 声明一个 Prefix 实例

prefix 路由前缀字符串,可以为空; m 中间件函数,按顺序调用;

func (*Router) Put

func (r *Router) Put(pattern string, h http.Handler) *Router

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

func (*Router) PutFunc

func (r *Router) PutFunc(pattern string, f http.HandlerFunc) *Router

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

func (*Router) Remove

func (r *Router) Remove(pattern string, methods ...string)

Remove 移除指定的路由项

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

func (*Router) Resource

func (r *Router) Resource(pattern string, m ...middleware.Func) *Resource

Resource 创建一个资源路由项

pattern 资源地址; m 中间件函数,按顺序调用;

func (*Router) Routes

func (r *Router) Routes() map[string][]string

Routes 返回当前路由组的路由项

键名为请求地址,键值为对应的请求方法。

func (*Router) ServeHTTP

func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request)

func (*Router) URL

func (r *Router) URL(strict bool, pattern string, params map[string]string) (url string, err error)

URL 根据参数生成地址

strict 是否检查路由是否真实存在以及参数是否符合要求; pattern 为路由项的定义内容; params 为路由项中的参数,键名为参数名,键值为参数值。

Directories

Path Synopsis
Package group 提供了按条件进行分组路由的功能
Package group 提供了按条件进行分组路由的功能
internal
options
Package options 提供了初始化路由的参数对象
Package options 提供了初始化路由的参数对象
syntax
Package syntax 负责处理路由语法
Package syntax 负责处理路由语法
tree
Package tree 提供了以树形结构保存路由项的相关操作
Package tree 提供了以树形结构保存路由项的相关操作
Package middleware 中间件管理
Package middleware 中间件管理
Package params 路由参数的相关声明
Package params 路由参数的相关声明

Jump to

Keyboard shortcuts

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