使用 Chi 的基于标头的路由

我正在尝试使用 Chi 路由器实现两条路由。仅当“主机”标头设置为 example.com 时才应调用一个。但是只会调用最后添加的路由。


r := chi.NewRouter()

r.Use(middleware.Logger)


middlewareHeader := middleware.RouteHeaders().Route("Host", "example.com", middleware.New(r)).Handler

r.With(middlewareHeader).MethodFunc("get", "/", func(w http.ResponseWriter, r *http.Request) {

    log.Println("Host: example.com")

    echo(w, r)

})


middlewareNone := middleware.RouteHeaders().Handler

r.With(middlewareNone).MethodFunc("get", "/", func(w http.ResponseWriter, r *http.Request) {

    echo(w, r)

})


srv := &http.Server{

    Handler:      r,

    Addr:         "127.0.0.1:8080",

    WriteTimeout: 15 * time.Second,

    ReadTimeout:  15 * time.Second,

}


log.Fatal(srv.ListenAndServe())


MMTTMM
浏览 79回答 1
1回答

慕村9548890

如评论所述:您不能将多个处理程序分配给一条路线。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})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go