天天看點

什麼是中間件?

在Go的web應用裡面,會有請求到

Handler

,當請求進來的時候,會被路由到某個

Handler上

,最終這個

Handler

就會處理這個請求,然後傳回一個響應

什麼是中間件?

而我們使用中間件的時候,我們會把中間件放到請求管道的中間,即最終的

Handler

之前,是以請求會先到達中間件,中間件會把請求轉發到相應的

Handler

Handler

處理後把響應傳回到中間件,中間件會把響應原來傳回給請求的發送方。

什麼是中間件?

最終我們發現,所有的請求都會經過中間件,是以中間件可以對請求和響應做集中的限制和操作。

中間件的用途

  • Logging
  • 安全
  • 請求逾時
  • 響應壓縮

如何實作

通過重寫

ServeHTTP

方法,把

http

服務路由到我們指定的處理程式上。

func main() {
	http.HandleFunc("/hello",Hello)
	http.ListenAndServe(":8080", new(Middleware))
}

func Hello(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello World!"))
}

type Middleware struct {
	Next http.Handler
}

func (m Middleware) ServeHTTP(w http.ResponseWriter, r *http.Request)  {
	if m.Next == nil {
		m.Next = http.DefaultServeMux
	}

	auth := r.Header.Get("Authorization")
	if auth != "" {
		m.Next.ServeHTTP(w, r)
	}else {
		w.Write([]byte("權限不足!"))
		w.WriteHeader(http.StatusUnauthorized)
	}
}