http/Middleware

什么是中间件

Go 语言中 Middleware 在 Handle 前,因此有:

[请求] --> [Middleware] --> [Handle]
[响应] <-- [Middleware] <-- [Handle]

创建中间件

前情提要:

  • func ListenAndServe(add string, handler Handler) error
    • handler 如果是 nil: DefaultServeMux
type Handler interface {
    ServeHttp(ResponseWriter, *Request)
}
// 中间件既实现了Handler接口,其字段也是Handler, 类似链表,可以把多个中间件串起来
type MyMiddleware struct {
    Next http.Handler
}

func (m MyMiddleware)ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // 在next handler 之前做事
    m.next.ServeHTTP(w, r)
    // 在 next handler 之后做事
}

中间件用途

  • Logging
  • 安全
  • 请求超时
  • 响应压缩
package middleware

import "net/http"

type AuthMiddleware struct {
    Next http.Handler
}

func (am *AuthMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if am.Next == nil {
        am.Next = http.DefaultServeMux
    }
    auth := r.Header.Get("Authorization")
    if auth != "" {
        am.Next.ServeHTTP(w, r)
    } else {
        w.WriteHeader(http.StatusUnauthorized)
    }
}


// main.go
package main

import (
    "net/http"
    "middleware"
)

func main() {
    http.HandleFunc("/companies", func(w http.ResponseWriter, r *http.Request) {
        c := Company {
            ID: 123,
            Name: "Google",
            Country: "USA",
        }
        enc := json.NewEncoder(w)
        enc.Encode(c)
    })
    http.ListenAndServe(":8080", new(middleware.AuthMiddleware))
}