2017-03-02 91 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,這有可能嗎?

+2

'http.HandleFunc'適用於'DefaultServeMux',而不是''handler'。你想添加'處理程序'到'ServeMux'或者你想添加'/ testing'到你的'handler'嗎? – JimB

+0

@JimB向ServeMux添加處理程序似乎是更好的解決方案,對吧?因爲向處理程序添加'/ testing'不會跳過中間件,對嗎? –

+0

是的,如果'handler'沒有在中間件之前做任何混合,那麼你需要單獨做--ServeMux(或任何複用器/路由器包)可以爲你做。 – JimB

回答

2

您可以使用http.ServeMux將請求路由到正確的處理程序:

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) 

使用http.HandleFunchttp.Handle功能將使用http.DefaultServerMux實現相同的結果,在這種情況下,你會離開的處理器參數ListenAndServe作爲nil

+0

是的,這正是我所期待的,謝謝! –

1

試試這個,ListenAndServe處理函數通常爲零。

http.Handle("/", handler) 

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