gorilla/mux是一个强大的URL路由器和golang调度程序。它实现了请求路由器和调度程序,用于将传入请求与其各自的处理程序进行匹配。

介绍

名称mux代表“HTTP请求多路复用器”。与标准一样http.ServeMux,mux.Router将传入请求与已注册路由列表进行匹配,并调用与URL或其他条件匹配的路由的处理程序。主要特点是:

它实现了http.Handler接口,因此它与标准兼容http.ServeMux。 可以根据URL主机,路径,路径前缀,方案,标头和查询值,HTTP方法或使用自定义匹配器来匹配请求。 URL主机,路径和查询值可以包含带有可选正则表达式的变量。 注册的URL可以构建或“反转”,这有助于维护对资源的引用。 路由可用作子路由器:仅在父路由匹配时才测试嵌套路由。这对于定义共享公共条件(如主机,路径前缀或其他重复属性)的路由组非常有用。作为奖励,这可以优化请求匹配。

Mux支持向路由器添加middleware,如果找到匹配项,则按照添加的顺序执行,包括其子路由。middleware通常是一小段代码, 它们接受一个请求,对其执行某些操作,然后将其传递给另一个middleware或最终处理程序handler。middleware的一些常见 用例是请求日志记录header操作或ResponseWriter劫持.

初始化变量

// github.com/gorilla/mux
mux:=mux.NewRouter()

第一种:Handle

// handle:是一个函数,返回的是http.Handler类型
mux.Handle("/test",handle).Methods("GET").Schemes("http")

// Handle原始方法签名是:
// Handle registers a new route with a matcher for the URL path.
// See Route.Path() and Route.Handler().
func (r *Router) Handle(path string, handler http.Handler) *Route {
	return r.NewRoute().Path(path).Handler(handler)
}
// Handler sets a handler for the route.
func (r *Route) Handler(handler http.Handler) *Route {
	if r.err == nil {
		r.handler = handler
	}
	return r
}

第二种:HandleFunc

// handle:是一个方法,方法签名是func(w ResponseWriter, r *http.Request)
mux.HandleFunc("/test",handle).Methods("GET").Schemes("http")

// HandleFunc原始方法签名是:
// HandleFunc registers a new route with a matcher for the URL path.
// See Route.Path() and Route.HandlerFunc().
func (r *Router) HandleFunc(path string, f func(http.ResponseWriter,
	*http.Request)) *Route {
	return r.NewRoute().Path(path).HandlerFunc(f)
}
// HandlerFunc sets a handler function for the route.
func (r *Route) HandlerFunc(f func(http.ResponseWriter, *http.Request)) *Route {
	return r.Handler(http.HandlerFunc(f))
}
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)

第三种:Handler

// handler:是一个函数,返回的是http.Handler类型
mux.PathPrefix("/test").Handler(handler).Methods("GET").Schemes("http")

// Handler sets a handler for the route.
func (r *Route) Handler(handler http.Handler) *Route {
	if r.err == nil {
		r.handler = handler
	}
	return r
}

第四种:HandlerFunc

// handler:是一个方法,方法签名是func(w ResponseWriter, r *http.Request)
mux.PathPrefix("/test").HandlerFunc(handler).Methods("GET").Schemes("http")

// HandlerFunc sets a handler function for the route.
func (r *Route) HandlerFunc(f func(http.ResponseWriter, *http.Request)) *Route {
	return r.Handler(http.HandlerFunc(f))
}
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)

总结

mux.Handle("/test",handler)和mux.PathPrefix("/test").Handler(handler)一样;

mux.HandleFunc("/test",handle)和mux.PathPrefix("/test").HandlerFunc(handler)一样;

http.HandleFunc: 
调用http.HandleFunc->调用DefaultServerMux.HandleFunc->调用DefaultServerMux的Handle

http.ListenAndServe: 
实例化Server->调用Server.ListenAndServe()->为每一个请求建立一个连接,同时进行逻辑的处理,进行go c.serve(),
读取每个请求的内容->调用handler.ServeHttp->根据request选择handler->mux.handler(r).ServeHTTP(w,r),选择handler。

go net/http包分析

go net/http包分析