1、handler 概念
- handler 是一个 inrerface。下面仅有一个方法 ServeHTTP
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
- ServeHTTP 一共两个参数
- 第一个参数 ResponseWriter 是用来 返回响应的
- 第二个参数是 一个指向 request 结构体的指针。这个request 值得就是我们 的请求。里面包含一些请求的信息
- 只要含有我们这个ServeHTTP方法,就是一个handle
2、创建 server
创建server 有两种形式
2.1 http.ListenAndServe()
func ListenAndServe(addr string, handler Handler) error {
server := &Server{
Addr: addr, Handler: handler}
return server.ListenAndServe()
}
func main() {
http.ListenAndServe("localhost:8080", nil)
}
- addr 表示网络地址,如果是空的话,表示端口默认为 80
- 第二个参数 是 handler。如果未空的话默认使用 DefaultServeMux
ListenAndServe 底层调用还是 server 下面的 ListenAndServe 方法。所以第二种方法是直接自己创建 server ,然后调用 ListenAndServe
2.2 server.ListenAndServer
源码
func (srv *Server) ListenAndServe() error {
if srv.shuttingDown() {
return ErrServerClosed
}
addr := srv.Addr
if addr == "" {
addr = ":http"
}
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
return srv.Serve(ln)
}
使用
func main() {
server := &http.Server{
Addr: "localhost:80",
Handler: nil,
}
server.ListenAndServe()
}
- 两者都可以创建 server ,但是 http.server 配置更加灵活
3、 DefaultServeMux
创建server 的时候,不指定handler 的情况下 默认使用的是 DefaultServeMux。DefaultServeMux也是一个handler
- DefaultServeMux 是一个多路复用器(路由)
- 他也是一个handler
http 请求进来之后会先经过 DefaultServeMux ,然后 DefaultServeMux 再转发给不同的 handler 去处理
var DefaultServeMux = &defaultServeMux
DefaultServeMux 实际上是一个指针变量,指向 defaultServeMux
var defaultServeMux ServeMux
defaultServeMux 是 ServeMux 类型的实例
func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) {
if r.RequestURI == "*" {