Go chi 中间件将项目添加到响应 header
Go chi middleware to add item to response header
我的想法很简单,我想添加请求ID(由chi middleware.RequestID
生成到响应header)。
我下面的代码添加了 X-Request-Id
但没有添加 ID 本身。我不确定为什么,因为它肯定在上下文中可用,因为 middleware.RequestID
在中间件链中更高?
我的路由器创建:
package rest
import (
"time"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"goWebAPI/pkg/database"
"goWebAPI/pkg/rest/mw"
"goWebAPI/pkg/rest/routes"
)
func GetRouter(db *database.Database) *chi.Mux {
r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(mw.SendRequestID)
r.Use(middleware.RealIP)
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
r.Use(middleware.Timeout(60 * time.Second))
r.Get("/", routes.IndexRoute())
return r
}
我的自定义中间件:
package mw
import (
"context"
"net/http"
"github.com/go-chi/chi/v5/middleware"
)
const requestIDHeader = "X-Request-Id"
func SendRequestID(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
if w.Header().Get(requestIDHeader) == "" {
w.Header().Add(
requestIDHeader,
middleware.GetReqID(context.Background()),
)
}
next.ServeHTTP(w, r.WithContext(ctx))
}
return http.HandlerFunc(fn)
}
我的索引路线:
package routes
import "net/http"
func IndexRoute() http.HandlerFunc {
fn:= func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("welcome"))
}
return fn
}
我认为您的问题出在这里:
middleware.GetReqID(context.Background())
这会尝试获取新的空上下文的请求 ID,而您需要的是当前请求的请求 ID,这意味着它 应该 是:
middleware.GetReqID(r.Context)
(或者,因为您已经在本地获取请求上下文 ctx
,您也可以使用它。)
这是documented in GetReqId
(强调我的):
GetReqID returns a request ID from the given context if one is present. Returns the empty string if a request ID cannot be found.
我的想法很简单,我想添加请求ID(由chi middleware.RequestID
生成到响应header)。
我下面的代码添加了 X-Request-Id
但没有添加 ID 本身。我不确定为什么,因为它肯定在上下文中可用,因为 middleware.RequestID
在中间件链中更高?
我的路由器创建:
package rest
import (
"time"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"goWebAPI/pkg/database"
"goWebAPI/pkg/rest/mw"
"goWebAPI/pkg/rest/routes"
)
func GetRouter(db *database.Database) *chi.Mux {
r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(mw.SendRequestID)
r.Use(middleware.RealIP)
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
r.Use(middleware.Timeout(60 * time.Second))
r.Get("/", routes.IndexRoute())
return r
}
我的自定义中间件:
package mw
import (
"context"
"net/http"
"github.com/go-chi/chi/v5/middleware"
)
const requestIDHeader = "X-Request-Id"
func SendRequestID(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
if w.Header().Get(requestIDHeader) == "" {
w.Header().Add(
requestIDHeader,
middleware.GetReqID(context.Background()),
)
}
next.ServeHTTP(w, r.WithContext(ctx))
}
return http.HandlerFunc(fn)
}
我的索引路线:
package routes
import "net/http"
func IndexRoute() http.HandlerFunc {
fn:= func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("welcome"))
}
return fn
}
我认为您的问题出在这里:
middleware.GetReqID(context.Background())
这会尝试获取新的空上下文的请求 ID,而您需要的是当前请求的请求 ID,这意味着它 应该 是:
middleware.GetReqID(r.Context)
(或者,因为您已经在本地获取请求上下文 ctx
,您也可以使用它。)
这是documented in GetReqId
(强调我的):
GetReqID returns a request ID from the given context if one is present. Returns the empty string if a request ID cannot be found.