为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Chi 的基于标头的路由

使用 Chi 的基于标头的路由

Go
MMTTMM 2023-01-03 14:07:11
我正在尝试使用 Chi 路由器实现两条路由。仅当“主机”标头设置为 example.com 时才应调用一个。但是只会调用最后添加的路由。r := chi.NewRouter()r.Use(middleware.Logger)middlewareHeader := middleware.RouteHeaders().Route("Host", "example.com", middleware.New(r)).Handlerr.With(middlewareHeader).MethodFunc("get", "/", func(w http.ResponseWriter, r *http.Request) {    log.Println("Host: example.com")    echo(w, r)})middlewareNone := middleware.RouteHeaders().Handlerr.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())
查看完整描述

1 回答

?
慕村9548890

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

})


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信