都說go標(biāo)準(zhǔn)庫實用,Api設(shè)計簡潔。這次就用go 標(biāo)準(zhǔn)庫中的net/http包實現(xiàn)一個簡潔的http web服務(wù)器,包括三種版本。
最簡單版 (推薦學(xué)習(xí):go)
直接使用
http.HandleFunc(partern,function(http.ResponseWriter,*http.Request){})
HandleFunc接受兩個參數(shù),第一個為路由地址,第二個為處理方法。
//v1 func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("httpserver v1")) }) http.HandleFunc("/bye", sayBye) log.Println("Starting v1 server ...") log.Fatal(http.ListenAndServe(":1210", nil)) } func sayBye(w http.ResponseWriter, r *http.Request) { w.Write([]byte("bye bye ,this is v1 httpServer")) }
自定義Handler
查看標(biāo)準(zhǔn)庫源碼,v1版本實際上是調(diào)用了handle方法,傳入的HandlerFunc實現(xiàn)了Handler的ServeHTTP方法,實際上是ServeHTTP在做http請求處理。
由此我們可以自定義自己的Handler,代碼如下:
// v2 func main() { mux := http.NewServeMux() mux.Handle("/", &myHandler{}) mux.HandleFunc("/bye", sayBye) log.Println("Starting v2 httpserver") log.Fatal(http.ListenAndServe(":1210", mux)) } type myHandler struct{} func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte("this is version 2")) } func sayBye(w http.ResponseWriter, r *http.Request) { w.Write([]byte("bye bye ,this is v2 httpServer")) }
自定義server配置
前面對Handler開了一次刀,下面我們看看http.ListenAndServe()中有些什么秘密。
原來這里可以自定義http服務(wù)器配置,都在Server這個結(jié)構(gòu)體中,這個對象能配置監(jiān)聽地址端口,配置讀寫超時時間,配置handler,配置請求頭最大字節(jié)數(shù)…,所有稍微改造一下上一個的程序得到現(xiàn)在的程序:
// v3 func main() { mux := http.NewServeMux() mux.Handle("/", &myHandler{}) mux.HandleFunc("/bye", sayBye) server := &http.Server{ Addr: ":1210", WriteTimeout: time.Second * 3, //設(shè)置3秒的寫超時 Handler: mux, } log.Println("Starting v3 httpserver") log.Fatal(server.ListenAndServe()) } type myHandler struct{} func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte("this is version 3")) } func sayBye(w http.ResponseWriter, r *http.Request) { // 睡眠4秒 上面配置了3秒寫超時,所以訪問 “/bye“路由會出現(xiàn)沒有響應(yīng)的現(xiàn)象 time.Sleep(4 * time.Second) w.Write([]byte("bye bye ,this is v3 httpServer")) }