什么是 http 请求多路复用器?
What is an http request multiplexer?
我一直在研究 golang,我注意到很多人使用 http.NewServeMux()
函数创建服务器,但我不太明白它的作用。
我读了这个:
In go ServeMux is an HTTP request multiplexer. It matches the URL of
each incoming request against a list of registered patterns and calls
the handler for the pattern that most closely matches the URL.
这与仅仅做类似的事情有何不同:
http.ListenAndServe(addr, nil)
http.Handle("/home", home)
http.Handle("/login", login)
使用多路复用的目的是什么?
来自 net/http
GoDoc 和来源。
ListenAndServe starts an HTTP server with a given address and handler. The handler is usually nil, which means to use DefaultServeMux. Handle and HandleFunc add handlers to DefaultServeMux
DefaultServeMux
只是预定义的 http.ServeMux
var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux
如您所见,http.Handle
在内部调用 DefaultServeMux
。
func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
http.NewServeMux()
的目的是拥有您自己的 http.ServerMux
实例,例如当您需要两个 http.ListenAndServe
函数侦听具有不同路由的不同端口时。
Golang 中的多路复用器类似于硬件中的多路复用器,它将一些输入乘以一些输出
我给了你一个简单的例子
type CustomMultiplexer struct {
}
给定的多路复用器必须实现 ServeHTTP
方法才能通过 http 注册到服务器输入
func (mux CustomMultiplexer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
SimpleRequestHandler(w, r)
return
}
http.NotFound(w, r)
return
}
我的SimpleRequestHandler
方法如下
func SimpleRequestHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
mySimpleGetRequestHandler(w, r)
break
default:
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
break
}
}
现在我可以使用我的 CustomMultiplxere
在传入请求之间进行多路复用
func main() {
customServer := CustomServer{}
err := http.ListenAndServe(":9001", &customServer)
if err != nil {
panic(err)
}
}
http.HandleFunc
方法作为我给定的简单多路复用器工作。
我一直在研究 golang,我注意到很多人使用 http.NewServeMux()
函数创建服务器,但我不太明白它的作用。
我读了这个:
In go ServeMux is an HTTP request multiplexer. It matches the URL of each incoming request against a list of registered patterns and calls the handler for the pattern that most closely matches the URL.
这与仅仅做类似的事情有何不同:
http.ListenAndServe(addr, nil)
http.Handle("/home", home)
http.Handle("/login", login)
使用多路复用的目的是什么?
来自 net/http
GoDoc 和来源。
ListenAndServe starts an HTTP server with a given address and handler. The handler is usually nil, which means to use DefaultServeMux. Handle and HandleFunc add handlers to DefaultServeMux
DefaultServeMux
只是预定义的 http.ServeMux
var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux
如您所见,http.Handle
在内部调用 DefaultServeMux
。
func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
http.NewServeMux()
的目的是拥有您自己的 http.ServerMux
实例,例如当您需要两个 http.ListenAndServe
函数侦听具有不同路由的不同端口时。
Golang 中的多路复用器类似于硬件中的多路复用器,它将一些输入乘以一些输出
我给了你一个简单的例子
type CustomMultiplexer struct {
}
给定的多路复用器必须实现 ServeHTTP
方法才能通过 http 注册到服务器输入
func (mux CustomMultiplexer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
SimpleRequestHandler(w, r)
return
}
http.NotFound(w, r)
return
}
我的SimpleRequestHandler
方法如下
func SimpleRequestHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
mySimpleGetRequestHandler(w, r)
break
default:
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
break
}
}
现在我可以使用我的 CustomMultiplxere
在传入请求之间进行多路复用
func main() {
customServer := CustomServer{}
err := http.ListenAndServe(":9001", &customServer)
if err != nil {
panic(err)
}
}
http.HandleFunc
方法作为我给定的简单多路复用器工作。