中间件模式 (Middleware Pattern)

未匹配的标注

中间件模式(Middleware Pattern)是一种常见的软件设计模式,常用于处理系统中的请求和响应,尤其是在 Web 开发领域中。

在 Go 语言中,中间件模式通常用于处理 HTTP 请求和响应,可以帮助开发人员在请求处理过程中添加额外的逻辑。具体来说,中间件是一种函数,可以访问请求和响应,并在请求处理期间对它们进行修改。

下面是一个简单的示例,其中我们创建了两个中间件函数,一个用于记录请求信息,另一个用于检查请求头中的 API 密钥。

package main

import (
    "log"
    "net/http"
)

// 定义一个记录请求信息的中间件
func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("%s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

// 定义一个检查 API 密钥的中间件
func apiKeyMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        apiKey := r.Header.Get("X-API-Key")
        if apiKey != "my-secret-key" {
            http.Error(w, "Invalid API key", http.StatusUnauthorized)
            return
        }
        next.ServeHTTP(w, r)
    })
}

// 定义一个处理请求的处理函数
func helloHandler(w http.ResponseWriter, r *http.Request) {
    if _, err := w.Write([]byte("Hello, World!")); err != nil {
        return
    }
}

func main() {
    // 创建一个处理器链
    handler := apiKeyMiddleware(loggingMiddleware(http.HandlerFunc(helloHandler)))

    // 启动 HTTP 服务器
    if err := http.ListenAndServe(":8080", handler); err != nil {
        panic("Server Error")
    }
}

在上面的示例中,我们首先定义了两个中间件函数 loggingMiddlewareapiKeyMiddleware,然后定义了一个处理请求的处理函数 helloHandler。接下来,我们创建了一个处理器链,通过 http.HandlerFunc 包装 helloHandler 函数,然后将它作为参数传递给中间件函数 loggingMiddlewareapiKeyMiddleware,最终生成一个链式处理器。在这个链式处理器中,loggingMiddleware 函数用于记录请求信息,apiKeyMiddleware 函数用于检查 API 密钥,helloHandler 函数用于处理请求。

最后,我们通过 http.ListenAndServe 函数启动 HTTP 服务器,将处理器链作为参数传递给它。当收到 HTTP 请求时,服务器将根据处理器链中的顺序依次调用中间件函数和处理函数,最终生成响应并将其发送回客户端。

总之,中间件模式是一种灵活且可扩展的模式,可以帮助开发人员轻松添加和组合逻辑,从而更好地处理请求和响应。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~