接收和处理GoWeb请求

69 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 对应的处理器。