Documentation
¶
Overview ¶
Copyright 2013 Julien Schmidt. All rights reserved. 使用本源代码受 BSD 风格许可协议的约束,该协议可在 LICENSE.BASE 文件中找到。 Copyright 2025 WJQSERVER, WJQSERVER-STUDIO. All rights reserved. 使用本源代码受 Apache 2.0许可协议的约束,该协议可在 LICENSE 文件中找到。 Package httprouter 是一个基于 trie 树的高性能 HTTP 请求路由器。
一个简单的例子是:
package main import ( "context" "fmt" "github.com/julienschmidt/httprouter" "log" "net/http" "time" ) func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { fmt.Fprint(w, "Welcome!\n") } func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { // 通过 r.Context() 获取上下文 ctx := r.Context() select { case <-ctx.Done(): // 客户端断开连接或请求被取消 log.Println("Client disconnected for /hello/:name") return default: // 继续正常处理 fmt.Fprintf(w, "hello, %s! (ctx available)\n", ps.ByName("name")) } } func LongProcess(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { ctx := r.Context() // 获取请求上下文 log.Printf("Starting long process for %s...\n", ps.ByName("task")) select { case <-time.After(10 * time.Second): // 模拟耗时操作 fmt.Fprintf(w, "Task %s completed!\n", ps.ByName("task")) log.Printf("Task %s completed normally.\n", ps.ByName("task")) case <-ctx.Done(): // 监听客户端断开或请求取消 // 如果 ctx.Done() 被关闭,意味着客户端断开连接或服务器取消了请求 (例如超时) // 这里的 err 会给出原因,例如 context.Canceled 或 context.DeadlineExceeded err := ctx.Err() log.Printf("Long process for %s cancelled/client disconnected: %v\n", ps.ByName("task"), err) // 可以在这里进行一些清理工作 // 注意:此时可能无法再向 ResponseWriter 写入数据,因为连接可能已经关闭 } } func AnyHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { fmt.Fprintf(w, "Handled by ANY for path %s, method %s\n", r.URL.Path, r.Method) } func main() { router := httprouter.New() router.GET("/", Index) router.GET("/hello/:name", Hello) router.GET("/long/:task", LongProcess) // 使用 Any 方法 router.ANY("/anypath", AnyHandler) router.ANY("/anypath/:param", AnyHandler) // 路由组示例 adminGroup := router.Group("/admin") adminGroup.GET("/dashboard", Index) adminGroup.ANY("/settings", AnyHandler) log.Println("Server starting on :8080...") log.Fatal(http.ListenAndServe(":8080", router)) }
... (其余注释保持不变) ...
Index ¶
- Variables
- func CleanPath(p string) string
- type ErrorHandlerFunc
- type Group
- func (g *Group) ANY(path string, handle Handle)
- func (g *Group) DELETE(relativePath string, handle Handle)
- func (g *Group) Delete(relativePath string, handle Handle)
- func (g *Group) GET(relativePath string, handle Handle)
- func (g *Group) Get(relativePath string, handle Handle)
- func (g *Group) HEAD(relativePath string, handle Handle)
- func (g *Group) Handle(method, relativePath string, handle Handle)
- func (g *Group) Handler(method, relativePath string, handler http.Handler)
- func (g *Group) HandlerFunc(method, path string, handler http.HandlerFunc)
- func (g *Group) Head(relativePath string, handle Handle)
- func (g *Group) OPTIONS(relativePath string, handle Handle)
- func (g *Group) Options(relativePath string, handle Handle)
- func (g *Group) PATCH(relativePath string, handle Handle)
- func (g *Group) POST(relativePath string, handle Handle)
- func (g *Group) PUT(relativePath string, handle Handle)
- func (g *Group) Patch(relativePath string, handle Handle)
- func (g *Group) Post(relativePath string, handle Handle)
- func (g *Group) Put(relativePath string, handle Handle)
- func (g *Group) ServeFiles(relativePath string, root http.FileSystem)
- func (g *Group) Use(middleware ...Middleware)
- type Handle
- type Middleware
- type Param
- type Params
- type RecoveryHandlerFunc
- type Router
- func (r *Router) ANY(path string, handle Handle)
- func (r *Router) DELETE(path string, handle Handle)
- func (r *Router) Delete(path string, handle Handle)
- func (r *Router) GET(path string, handle Handle)
- func (r *Router) Get(path string, handle Handle)
- func (r *Router) GetDefaultErrHandler() ErrorHandlerFunc
- func (r *Router) GetErrorHandler() ErrorHandlerFunc
- func (r *Router) Group(prefix string) *Group
- func (r *Router) HEAD(path string, handle Handle)
- func (r *Router) Handle(method, path string, handle Handle)
- func (r *Router) Handler(method, path string, handler http.Handler)
- func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc)
- func (r *Router) Head(path string, handle Handle)
- func (r *Router) IsUsingDefaultErrorHandler() bool
- func (r *Router) Lookup(method, path string) (Handle, Params, bool)
- func (r *Router) OPTIONS(path string, handle Handle)
- func (r *Router) Options(path string, handle Handle)
- func (r *Router) PATCH(path string, handle Handle)
- func (r *Router) POST(path string, handle Handle)
- func (r *Router) PUT(path string, handle Handle)
- func (r *Router) Patch(path string, handle Handle)
- func (r *Router) Post(path string, handle Handle)
- func (r *Router) Put(path string, handle Handle)
- func (r *Router) ServeFiles(path string, root http.FileSystem)
- func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request)
- func (r *Router) ServeUnmatched(fs http.FileSystem)
- func (r *Router) SetErrorHandler(handler ErrorHandlerFunc)
- func (r *Router) Use(middleware ...Middleware)
Constants ¶
This section is empty.
Variables ¶
var DefaultMethodsForAny = []string{ http.MethodGet, http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete, http.MethodHead, http.MethodOptions, }
DefaultMethodsForAny 定义了 ANY 方法将注册的 HTTP 方法列表
var MatchedRoutePathParam = "$matchedRoutePath"
MatchedRoutePathParam 是存储匹配路由路径的 Param 名称, 如果设置了 Router.SaveMatchedRoutePath。
var ParamsKey = paramsKey{}
ParamsKey 是 URL 参数存储在请求上下文中的键。 用户可以使用 `req.Context().Value(httprouter.ParamsKey)` 来获取参数, 但通常直接使用 Handle 函数签名中的 `Params` 参数更方便。
Functions ¶
func CleanPath ¶
CleanPath is the URL version of path.Clean, it returns a canonical URL path for p, eliminating . and .. elements.
The following rules are applied iteratively until no further processing can be done:
- Replace multiple slashes with a single slash.
- Eliminate each . path name element (the current directory).
- Eliminate each inner .. path name element (the parent directory) along with the non-.. element that precedes it.
- Eliminate .. elements that begin a rooted path: that is, replace "/.." by "/" at the beginning of a path.
If the result of this process is an empty string, "/" is returned
Types ¶
type ErrorHandlerFunc ¶ added in v0.0.4
type ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, statusCode int)
ErrorHandlerFunc 定义了处理HTTP错误的函数的签名。 它接收状态码以及标准的ResponseWriter和Request。
type Group ¶
type Group struct {
// contains filtered or unexported fields
}
Group 代表一个路由组,具有一个路径前缀。
func (*Group) HandlerFunc ¶
func (g *Group) HandlerFunc(method, path string, handler http.HandlerFunc)
HandlerFunc 是 Group 的 router.HandlerFunc 的快捷方式
func (*Group) ServeFiles ¶
func (g *Group) ServeFiles(relativePath string, root http.FileSystem)
ServeFiles 是 Group 的 router.ServeFiles 的快捷方式
func (*Group) Use ¶
func (g *Group) Use(middleware ...Middleware)
type Handle ¶
type Handle func(http.ResponseWriter, *http.Request, Params)
Handle 是一个可以注册到路由以处理 HTTP 请求的函数。 类似于 http.HandlerFunc,但有第三个参数用于通配符(路径变量)的值。 **重要提示**: 可以通过 `r.Context()` 在此函数内部获取 `context.Context`。 该上下文可用于感知客户端断开连接 (`<-r.Context().Done()`) 或传递请求范围的值。
type Middleware ¶
Middleware 是一个可以封装 http.Handler 的函数。 典型的用法是在调用链中执行预处理或后处理操作。
type Params ¶
type Params []Param
Params 是一个 Param 切片,由路由器返回。 切片是有序的,第一个 URL 参数也是第一个切片值。 因此通过索引读取值是安全的。
func ParamsFromContext ¶
ParamsFromContext 从请求上下文中提取 URL 参数, 如果不存在则返回 nil。
func (Params) MatchedRoutePath ¶
MatchedRoutePath 检索匹配路由的路径。 必须在添加相应的处理程序时启用 Router.SaveMatchedRoutePath, 否则此函数始终返回空字符串。
type RecoveryHandlerFunc ¶
type RecoveryHandlerFunc func(http.ResponseWriter, *http.Request, interface{})
RecoveryHandlerFunc 定义了处理从 panic 中恢复的函数的签名。
type Router ¶
type Router struct { // Middlewares 是应用于所有请求的全局中间件列表。 // 中间件按照在 Use 方法中添加的顺序执行。 Middlewares []Middleware // 如果启用,在调用处理程序之前将匹配的路由路径添加到 http.Request 上下文。 // 匹配的路由路径只添加到启用此选项时注册的路由处理程序。 SaveMatchedRoutePath bool // 如果当前路由无法匹配,但存在带(或不带)尾部斜杠的路径处理程序,则启用自动重定向。 // 例如,如果请求 /foo/ 但只存在 /foo 的路由,则客户端将被重定向到 /foo, // 对于 GET 请求使用 http 状态码 301,对于所有其他请求方法使用 308。 RedirectTrailingSlash bool // 如果启用,路由器会尝试修复当前请求路径,如果没有为其注册处理程序。 // 首先,会移除诸如 ../ 或 // 等多余的路径元素。 // 然后,路由器会对清理后的路径进行不区分大小写的查找。 // 如果找到了该路由的处理程序,路由器会以状态码 301(GET 请求)和 308(所有其他请求方法) // 重定向到修正后的路径。 // 例如,/FOO 和 /..//Foo 可以被重定向到 /foo。 // RedirectTrailingSlash 与此选项无关。 RedirectFixedPath bool // 如果启用,当当前请求无法路由时,路由器会检查是否允许使用其他方法。 // 如果是这种情况,请求会以“不允许使用的方法”和 HTTP 状态码 405 进行响应。 // 如果没有允许的其他方法,则将请求委托给 NotFound 处理程序。 HandleMethodNotAllowed bool // 如果启用,路由器会自动回复 OPTIONS 请求。 // 自定义 OPTIONS 处理程序优先于自动回复。 HandleOPTIONS bool // 一个可选的 http.Handler,在自动 OPTIONS 请求时调用。 // 只有当 HandleOPTIONS 为 true 且未设置特定路径的 OPTIONS 处理程序时,才会调用此处理程序。 // 在调用处理程序之前会设置 "Allowed" 头部。 GlobalOPTIONS http.Handler // 可配置的 http.Handler,当找不到匹配的路由时调用。 // 如果未设置,则使用 http.NotFound。 NotFound http.Handler // 可配置的 http.Handler,当请求无法路由且 HandleMethodNotAllowed 为 true 时调用。 // 如果未设置,则使用 http.Error 和 http.StatusMethodNotAllowed。 // 在调用处理程序之前会设置包含允许请求方法的 "Allow" 头部。 MethodNotAllowed http.Handler // RecoveryHandler 是处理从 http 处理程序(包括中间件和路由处理程序)恢复的 panic 的函数。 // 如果设置,当 panic 发生并被恢复时,会调用此函数。 // 它接收原始的 ResponseWriter、Request 和 panic 的值 (interface{})。 // 如果未设置,则 panic 会继续传播(回到 net/http 的 ServeHTTP,可能导致连接关闭)。 RecoveryHandler RecoveryHandlerFunc // FileSystemForUnmatched 用于在没有匹配到预定义路由时服务静态文件。 // 如果设置且 ServeUnmatchedAsStatic 为 true,则未匹配路由将尝试在此文件系统中查找文件。 FileSystemForUnmatched http.FileSystem // ServeUnmatchedAsStatic 如果启用,则将所有未匹配的路由尝试作为静态文件处理, // 使用 FileSystemForUnmatched 指定的文件系统。 ServeUnmatchedAsStatic bool // contains filtered or unexported fields }
Router 是一个 http.Handler,可用于通过可配置的路由将请求分派到不同的处理程序函数。
func (*Router) ANY ¶ added in v0.0.3
ANY 为所有 DefaultMethodsForAny 中定义的方法注册相同的处理函数。 这对于捕获所有类型的请求到单个端点非常有用。
func (*Router) GetDefaultErrHandler ¶ added in v0.0.4
func (r *Router) GetDefaultErrHandler() ErrorHandlerFunc
返回默认errhandle
func (*Router) GetErrorHandler ¶ added in v0.0.4
func (r *Router) GetErrorHandler() ErrorHandlerFunc
GetErrorHandler 返回当前配置的错误处理函数。 注意:直接比较返回的函数与 defaultErrorHandler 可能不可靠。 请使用 Router.IsUsingDefaultErrorHandler() 来检查是否正在使用默认处理器。
func (*Router) Handler ¶
Handler 是一个适配器,允许将 http.Handler 用作请求处理程序。 Params 在请求上下文中可以通过 ParamsKey 获取。 **重要**: req.Context() 会被用于传递 Params。
func (*Router) HandlerFunc ¶
func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc)
HandlerFunc 是一个适配器,允许将 http.HandlerFunc 用作请求处理程序。
func (*Router) IsUsingDefaultErrorHandler ¶ added in v0.0.4
IsUsingDefaultErrorHandler 返回 true 如果当前路由器正在使用默认的错误处理器。
func (*Router) ServeFiles ¶
func (r *Router) ServeFiles(path string, root http.FileSystem)
ServeFiles 从给定的文件系统根目录提供文件。 ... (方法内部逻辑基本保持不变, 但注意 context 的传递)
func (*Router) ServeHTTP ¶
func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request)
ServeHTTP 使路由器实现 http.Handler 接口。 它应用全局中间件,然后执行核心路由匹配、处理和错误处理逻辑。 **重要**: req.Context() 在这里是源头,它会被传递下去。 中间件和最终的路由处理函数都可以访问和使用这个上下文。
func (*Router) ServeUnmatched ¶
func (r *Router) ServeUnmatched(fs http.FileSystem)
ServeUnmatched 配置路由器将所有未匹配的路由尝试作为静态文件处理。 fs 指定了静态文件的根目录。
func (*Router) SetErrorHandler ¶ added in v0.0.4
func (r *Router) SetErrorHandler(handler ErrorHandlerFunc)
SetErrorHandler 允许用户设置自定义的错误处理函数。 如果传入 nil,则会恢复为默认的错误处理函数。
func (*Router) Use ¶
func (r *Router) Use(middleware ...Middleware)
Use 将一个或多个全局中间件添加到路由器。 中间件按照添加的顺序在处理链中从外向内执行。 例如,Use(A, B) 将导致请求按 A -> B -> 最终处理程序 的顺序执行。