持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
Web服务器接受请求和响应的流程大致如下:
- 客户端向服务器发送请求
- 服务器的多路复用器会首先收到请求,然后根据URL找到对应的处理器,由处理器进行处理。
- 处理器根据情况从数据库拿到数据,将数据通过模板引擎组装在指定的模板里,然后将渲染好的模板发送给客户端。
- 客户端拿到完整页面,解析后展示给用户。
ServeMux和DefaultServeMux
多路复用器是通过ServeMux实现的,ServeMux是一个结构体,这个结构体实现多路复用的核心是一个映射,这个映射记录URL和其对应的处理器,它会在映射中找出与被请求URL最为匹配的URL,然后调用对应处理器的ServeHTTP()方法。
DefaultServeMux是ServeMux的一个实例,是默认多路复用器,如果用户没有在Server对象指定处理器,则会默认使用DefaultServeMux作为多路复用器。
HandleFunc()用于给URL注册一个处理器,并将URL和与之对应的处理器存放到多路复用器的映射里。与HandleFunc()函数类似的还有一个HandlerFunc()函数,这个函数是给URL注册一个处理器函数。
并不推荐使用默认多路复用器,因为DefaultServeMux是一个全局变量,有些第三方代码会在默认多路复用器中注册一些处理器,可能会与我们注册的处理器发生冲突,因此建议自定义多路复用器。
自定义多路复用器
自定义多路复用器需要调用http.NewServeMux()函数,然后创建一个服务器对象Server,通过指定服务器的参数,使用自定义多路复用器。
func t(w http.ResponseWriter,r *http.Request){
w.Write([]byte("Hello"))
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/",t)
server := &http.Server{
Addr: ":9000",
Handler: mux,
}
if err := server.ListenAndServe();err!=nil{
log.Fatal(err)
}
}
ServeMux的URL路由匹配
- 请求的URL为/,则调用 / 对应的处理器。
- 请求的URL为/hi,则调用 /hi 对应的处理器。
- 如果请求的URL为 /hi/web,则调用 /hi/web 对应的处理器。