在 Golang 中,Middleware 和 Handler 是两个概念。
Handler 用于处理请求,可以看作是业务逻辑的实现。在 http 包中,Handler 接口如下:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
Middleware 则是对请求进行一些预处理或者后置处理的过程。它本身也实现了 Handler 接口,因此 Middleware 可以通过组合多个 Middleware 来形成一个完整的请求处理链。常见的 Middleware 操作包括记录日志、验证权限、解析 body 等。
下面我们来看一个例子,说明如何使用 Middleware 和 Handler 组成一个完整的 HTTP 处理流程:
package main
import (
"fmt"
"net/http"
)
// Middleware1 记录日志
func Middleware1(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("log request:", r.URL.Path)
next.ServeHTTP(w, r)
})
}
// Middleware2 验证权限
func Middleware2(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// TODO: 验证用户权限
next.ServeHTTP(w, r)
})
}
// HelloHandler 处理请求
func HelloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello World!")
}
func main() {
// 创建路由器并注册路由规则和对应的 Handler 函数
router := http.NewServeMux()
router.HandleFunc("/", HelloHandler)
// 使用中间件包装 Handler
handler := Middleware2(Middleware1(router))
// 启动 HTTP 服务并监听端口
http.ListenAndServe(":8080", handler)
}
在上面的例子中,我们使用了两个 Middleware(Middleware1 和 Middleware2),它们分别用于记录日志和验证用户权限。然后将路由器包装成一个完整的 Handler(handler 变量),最后通过 ListenAndServe 方法启动 HTTP 服务。
当客户端向服务器发送请求时,请求会先经过 Middleware1 处理,然后再经过 Middleware2 处理,最终交给 HelloHandler 函数处理,并将结果返回给客户端。这样就形成了一个完整的请求处理链。
内容由零声教学AI助手提供,问题来源于学员提问