go-chi中间件学习| 青训营笔记

787 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天

go-chi是一个轻量级、灵活和高性能的HTTP框架,它提供了丰富的中间件支持,可以帮助我们快速地实现各种HTTP处理逻辑,使用中间件框架时,我们需要根据自己的需求选择合适的中间件,并编写自定义的中间件来实现特定的功能。同时,我们需要注意中间件的顺序,保证它们按照正确的顺序被执行。。

  1. logger:记录HTTP请求和响应的日志。
  2. recoverer:处理HTTP处理函数中的panic异常,避免HTTP服务器崩溃。
  3. requestID:为每个HTTP请求生成唯一的请求ID,方便日志记录和调试。
  4. timeout:设置HTTP请求的超时时间,避免长时间的等待和阻塞。
  5. auth:实现HTTP请求的身份验证,保护受保护的资源。

使用go-chi的logger、recoverer、requestID、timeout和auth中间件,实现了HTTP请求的日志记录、panic异常处理、请求ID生成、超时时间设置和身份验证等功能。编写一个自定义的authMiddleware中间件,用于实现HTTP请求的身份验证。 实例:

package main

import (
    "fmt"
    "net/http"
    "time"

    "github.com/go-chi/chi"
    "github.com/go-chi/chi/middleware"
)

func main() {
    r := chi.NewRouter()

    // 使用logger中间件记录HTTP请求和响应的日志
    r.Use(middleware.Logger)

    // 使用recoverer中间件处理HTTP处理函数中的panic异常
    r.Use(middleware.Recoverer)

    // 使用requestID中间件为每个HTTP请求生成唯一的请求ID
    r.Use(middleware.RequestID)

    // 使用timeout中间件设置HTTP请求的超时时间
    r.Use(middleware.Timeout(5 * time.Second))

    // 使用auth中间件实现HTTP请求的身份验证
    r.Use(authMiddleware)

    // 添加HTTP处理函数
    r.Get("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, world!")
    })

    // 启动HTTP服务器
    http.ListenAndServe(":8080", r)
}

func authMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        token := r.Header.Get("Authorization")
        if token == "" {
            w.WriteHeader(http.StatusUnauthorized)
            return
        }
        // TODO: Validate token
        next.ServeHTTP(w, r)
    })
}