我正在使用大猩猩多路复用器来管理路由.我缺少的是在每个请求之间集成一个中间件.

例如

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "log"
    "net/http"
    "strconv"
)

func HomeHandler(response http.ResponseWriter, request *http.Request) {

    fmt.Fprintf(response, "Hello home")
}

func main() {

    port := 3000
    portstring := strconv.Itoa(port)

    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    http.Handle("/", r)

    log.Print("Listening on port " + portstring + " ... ")
    err := http.ListenAndServe(":"+portstring, nil)
    if err != nil {
        log.Fatal("ListenAndServe error: ", err)
    }
}

每个传入的请求都应该通过中间件.我怎样才能在这里集成一个中间件呢?

Update

我会将它与大猩猩/会话结合使用,他们会说:

重要提示:如果你没有使用gorilla/mux,你需要包装你的

我如何才能防止这种情况发生?

推荐答案

只需创建一个包装器,这在GO中相当容易:

func HomeHandler(response http.ResponseWriter, request *http.Request) {

    fmt.Fprintf(response, "Hello home")
}

func Middleware(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Println("middleware", r.URL)
        h.ServeHTTP(w, r)
    })
}
func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    http.Handle("/", Middleware(r))
}

Go相关问答推荐

Go -SDP服务器读缓冲区不会更改任何内容

如何预编译Golang标准库?

golang.org/x/oauth2 oauth2.Config.Endpoint.TokenURL mock:缺少access_token

在Golang中Mergesort的递归/并行实现中出现死锁

MaybeReadByte对通道的使用如何在Go中提供随机行为?

在GO中创建[]字符串类型的变量

如何使用Gio设置标题栏图标

nixOS 上的 Nginx 反向代理在try 加载 css/js 时返回 404

动态 SQL 集 Golang

整理时转换值

获取不带类型参数的泛型 struct 的类型名称

使用反射在 struct 内迭代切片 struct

转到文本/模板模板:如何根据模板本身的值数组判断值?

使用 oklog/run 来自 Go 编译器的错误(无值)用作值

使用 image/jpeg 编码导致图像饱和/错误像素

如何在循环中旋转图像以便在 golang 中创建 GIF?

Grafana/Prometheus 将多个 ip 可视化为查询

如何正确判断 io.Reader 是否为零?

如何使用 context.WithCancel 启动和停止每个会话的心跳?

Beego - 我需要context.Context而不是 Beego 上下文