实现一个简单的golangweb服务器

2018-10-30  本文已影响0人  一手好厨艺的IT民工

实现一个简单的golangweb服务器

func Test(w http.ResponseWriter, r *http.Request) {
            w.Write([]byte("hello"))
        }
type ServeMux struct {
    mu    sync.RWMutex
    m     map[string]muxEntry
    hosts bool // whether any patterns contain hostnames
}

type muxEntry struct {
    h       Handler
    pattern string
}

​ 回顾我们上面关于MainHandler的处理方法,可以看出,我们只用了其根路由"/",具体的处理函数,由MainHandler根据参数handler的解析结果交给具体的处理函数了。

1. http.HandleFunc("/",MainHandler)将"/"路径处理的函数注册进来,注册于DefaultServeMux中的m
2. 通过ListenAndServe来开启本地端口监听
3. 当有请求过来,开启一个go程进行服务
4. go程中读取请求内容,实例化serverHandler,并调用ServeHTTP处理
5. ServerHTTP,根据serverHandler中调用Handler的ServeHTTP具体实现
6. 在调用具体的ServeHTTP,如果没有handler那么则使用DefaultServer
func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {
    handler := sh.srv.Handler
    if handler == nil {
        handler = DefaultServeMux
    }
    if req.RequestURI == "*" && req.Method == "OPTIONS" {
        handler = globalOptionsHandler{}
    }
    handler.ServeHTTP(rw, req)
}
7. http.HandleFunc("/", MainHandler)而上面这个统一的入口则是对DefaultServeMux的初始化
8. 因此,最终所有的request请求,都会落到MainHandler中
9. 假设具体的请求体中的json解析完成,字段handler为Test(这里的handler并不是golang框架的handler,是自己json中的一个字段,用来指定服务服务接口的)
10. 调用Test处理器,进行处理
上一篇 下一篇

猜你喜欢

热点阅读