c语言编程笔录

首页 >   > 笔记大全

笔记大全

Go语言中常用的中间件有哪些

更新时间:2023-07-10

Go语言中常用的中间件

1. 中间件是什么

中间件指的是介于客户端和服务器端之间的一层处理器。它可以用来增强服务器的功能,比如添加日志、恢复机制、认证/授权等。

在Go语言中,中间件通常是一个函数或一个实现了http.Handler接口的结构体。它拥有传递http.Request和http.ResponseWriter参数的能力,并且可以调用后续的中间件或者处理器。

2. 日志中间件

日志中间件用于记录HTTP请求和响应的相关信息,以便于后续的分析和调试。下面是一个简单的日志中间件的例子:

    func Logger(next http.Handler) http.Handler {
      return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 记录请求开始时间和请求地址
        start :=time.Now()
        path :=r.URL.Path

        // 调用后续的中间件或者处理器
        next.ServeHTTP(w, r)

        // 计算请求处理时间
        latency :=time.Since(start)

        // 打印日志
        log.Printf("%s %s %s", r.Method, path, latency)
      })
    }

3. 恢复中间件

恢复中间件用于在程序发生Panic的时候进行恢复,以便于程序不会意外崩溃。下面是一个简单的恢复中间件的例子:

    func Recovery(next http.Handler) http.Handler {
      return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
          if err :=recover(); err !=nil {
            // 打印堆栈信息
            debug.PrintStack()
            // 给客户端返回500错误
            http.Error(w, "Internal Server Error", http.StatusInternalServerError)
          }
        }()
        // 调用后续的中间件或者处理器
        next.ServeHTTP(w, r)
      })
    }

4. 跨域中间件

跨域中间件用于解决跨域请求的问题。由于浏览器的安全策略,通过ajax等方式发出的跨域请求会被阻止,因此需要在服务器端添加一些特殊的HTTP头部。下面是一个简单的跨域中间件的例子:

    func Cors(next http.Handler) http.Handler {
      return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 允许任何来源的跨域请求
        w.Header().Set("Access-Control-Allow-Origin", "*")

        // 允许特定的HTTP方法
        w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE")

        // 允许特定的HTTP头部字段
        w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")

        // 如果是OPTIONS请求,直接返回200
        if r.Method==http.MethodOptions {
          w.WriteHeader(http.StatusOK)
          return
        }

        // 调用后续的中间件或者处理器
        next.ServeHTTP(w, r)
      })
    }