在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)
}
}