2017-03-02 7 views
1

はのは、私はハンドラはミドルウェアのトンを持っているこのバイパスgolang HTTPハンドラ

handler := middleware1.New(
    middleware2.New(
     middleware3.New(
      middleware4.New(
       NewHandler() 
      ), 
     ), 
    ), 
) 
http.ListenAndServe(":8080", handler) 

のようなコードがあるとしましょう。

は今、私はすべてのミドルウェアをスキップするカスタムエンドポイントを、作成したいので、内部serveHTTP()機能を何も何も実行されない:

http.HandleFunc("/testing", func(
    w http.ResponseWriter, 
    r *http.Request, 
) { 
    fmt.Fprintf(w, "it works!") 
    return 
}) 
http.ListenAndServe(":8080", handler) 

しかし、これは動作しないと/testingに達したことはありません。理想的には、私はhandlerを全く変更したくないです、それは可能ですか?あなたはListenAndServeにハンドラ引数を残すことになる場合にはhttp.DefaultServerMuxを、使用して同じ結果を達成するhttp.HandleFunchttp.Handle機能を使用して

m := http.NewServeMux() 
m.HandleFunc("/testing", func(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "it works!") 
    return 
}) 
m.Handle("/", handler) 

http.ListenAndServe(":8080", m) 

+2

'http.HandleFunc'は' DefaultServeMux'に適用され、 'handler'では適用されません。 'ServeMux'に' handler'を追加したいのですか、 '/ handler'を' handler'に追加しますか? – JimB

+0

@JimB ServeMuxにハンドラを追加する方が良い解決策だと思われます。ハンドラに '/ testing'を追加してもミドルウェアはスキップされないので、そうでしょうか? –

+0

「ハンドラー」がミドルウェアの前に多重化を行わない場合は、別にそれを行う必要があります.ServeMux(または任意のマルチプレクサー/ルータパッケージ)がそれを行うことができます。 – JimB

答えて

2

あなたは正しいハンドラにルート要求にhttp.ServeMuxを使用することができますnilとなります。

+0

はい、これは私が探していたものです。ありがとう! –

1

これを試すと、ListenAndServeハンドラは通常nilです。

http.Handle("/", handler) 

http.HandleFunc("/testing", func(
    w http.ResponseWriter, 
    r *http.Request, 
) { 
    fmt.Fprintf(w, "it works!") 
    return 
}) 
http.ListenAndServe(":8080", nil) 
関連する問題