- 簡介
服務端的http主要用作接受客服端的request讀取用戶傳入的信息,並將處理信息后的結果通過response返回給客戶端。在接受request的過程中最重要的一個環節就是路由(router),也就是實現一個Multiplexer器。Multipllexer路由將url匹配信息與處理器函數(handler)連接起來,當用戶訪問的url與路由中的url匹配,則會調用對應的處理器(handler)。Go 中內置了一個Multiplexer--DefaultServeMux。
總結一下http服務的流程就是:
- 首先客戶端(client)發起請求(Requests)
- 路由(router)匹配用戶發起的請求,並調用對應的處理器(handler)
- 處理器(handler)根據用戶傳入的數據返回對應的信息
- 信息通過response返回給客戶端
由以上流程中我們可以看出來,要理解Go http服務流程最重要的就是要先理解路由(router)和Handler
- Handler
首先我們來看一下Go內部定義的Handler的接口
type Handler interface{ ServeHTTP(ResponseWriter, *Request) }
看完Handler接口之后,我們不得不補充一點知識,才能繼續深入Handler
那就是Go在設計時並沒有引入類的繼承這樣的概念,而是使用了一種不常用的設計模式Duck Typing(它看起來像一只鴨子,那么它就是一只鴨子)。這種模式通過特征識別的方法來判斷類的歸屬,也就是說如果有兩個結構體,他們有相同的屬性,並且實現了同樣的方法,那么我們就認為這兩個結構體屬於同一個類
所以說我們從以上的Handler接口定義可以知道,任何結構體,只要實現了ServeHTTP方法,這個結構體就可以稱之為Handler對象。
處理器函數: 實現了以下簽名的函數被稱作handler處理器函數
func handlerName (w http.ResponseWriter, r *http.Request){}
Handler函數:經過HandlerFunc()包裝過的處理器函數,處理器函數在HandlerFunc這個函數內部實現了ServeHTTP接口方法的函數。也就是說處理器在被HandlerFunc包裝過后實現了Handler的接口
Handler對象:實現Handler接口中的ServeHTTP方法的結構
Http Server實例:
package main import{ "fmt"
"net/http" } //SayHello函數實現了處理器的簽名,所以這是一個處理器函數 func SayHello(w http.ResponseWriter, r *http.Request){ fmt.Println("Hello!!!") fmt.Fprintf(w, "Hello!!!") } func main(){
//注冊路由,將url規則與處理器函數綁定做一個map映射存起來,並且會實現ServeHTTP方法,使處理器函數變成Handler函數 http.HandleFunc("/", SayHello)
//開始監聽端口,沒進入一個連接,就會生成一個GoRoutine err := http.LinstenAndServe("0.0.0.0:8989", nil) if err != nil { fmt.Println("http listen failed") } }
- 使用外部路由庫,使路由綁定更方便功能更完備(待完成)
- Http中間件的使用與原理(待完成)