Go中的http服務流程、路由以及http中間件的使用


  • 簡介

  服務端的http主要用作接受客服端的request讀取用戶傳入的信息,並將處理信息后的結果通過response返回給客戶端。在接受request的過程中最重要的一個環節就是路由(router),也就是實現一個Multiplexer器。Multipllexer路由將url匹配信息與處理器函數(handler)連接起來,當用戶訪問的url與路由中的url匹配,則會調用對應的處理器(handler)。Go 中內置了一個Multiplexer--DefaultServeMux。

  總結一下http服務的流程就是:

  1. 首先客戶端(client)發起請求(Requests
  2. 路由(router)匹配用戶發起的請求,並調用對應的處理器(handler
  3. 處理器(handler)根據用戶傳入的數據返回對應的信息
  4. 信息通過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中間件的使用與原理(待完成)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM