1 回答
TA贡献1884条经验 获得超4个赞
如评论所述:您不能将多个处理程序分配给一条路线。
RouteHeaders 是一个简洁的基于标头的小型路由器,它允许您根据请求标头通过中间件堆栈引导请求流。
RouteHeaders用于通过特定的中间件堆栈放置您的请求,而不是更改路由。您仍然可以使用它,但中间件必须重定向到其他路由。
选项:
1.创建第二个路由并在中间件中重定向。
func redirectOnHeader(header, value string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get(header) == value {
http.Redirect(w, r, "/with-header", http.StatusMovedPermanently)
return
}
next.ServeHTTP(w, r)
})
}
}
然后在所需路由上调用中间件
r := chi.NewRouter()
r.With(redirectOnHeader("Host", "example.com")).Get("/", func(w http.ResponseWriter, r *http.Request) {
echo(w, r)
})
r.Get("/with-headers", func(w http.ResponseWriter, r *http.Request) {
echo(w, r)
})
2.使用第二个路由器和RouteHeaders
如文档中的示例。
请注意,您需要 2 个路由器才能拥有 2"/"条路由。
r := chi.NewRouter()
anotherR := chi.NewRouter()
r.Use(middleware.RouteHeaders().
Route("Host", "example.com", middleware.New(r)).
RouteDefault(middleware.New(anotherR)).
Handler)
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
echo(w, r)
})
anotherR.Get("/", func(w http.ResponseWriter, r *http.Request) {
echo(w, r)
})
3.在一个HandlerFunc中实现两个逻辑
func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get(header) == value {
// do something
return
}
// do something else
})
- 1 回答
- 0 关注
- 78 浏览
添加回答
举报