1 回答

TA貢獻1884條經驗 獲得超4個贊
如評論所述:您不能將多個處理程序分配給一條路線。
RouteHeaders 是一個簡潔的基于標頭的小型路由器,它允許您根據請求標頭通過中間件堆棧引導請求流。
RouteHeaders用于通過特定的中間件堆棧放置您的請求,而不是更改路由。您仍然可以使用它,但中間件必須重定向到其他路由。
選項:
1.創(chuàng)建第二個路由并在中間件中重定向。
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 關注
- 98 瀏覽
添加回答
舉報