第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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.創(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

})


查看完整回答
反對 回復 2023-01-03
  • 1 回答
  • 0 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號