亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何將一個新的 ServeMux 組合成一個更大的結構?

如何將一個新的 ServeMux 組合成一個更大的結構?

Go
守候你守候我 2021-11-08 14:35:19
在我以前使用 DefaultServeMux 制作的 golang 應用程序中,如果我有一個這樣的"/users/"路由,func user(name string)例如由 處理的路由,并且我向 發送了一個請求/users/jim,該請求仍將由該"/users/"路由處理。在我正在制作的當前應用程序中,我沒有使用,DefaultServeMux而只是傳遞一個實現 ServeHTTP 的處理程序,然后打開請求 url。但是,現在,如果我向不完全匹配的路由發送請求,則不會調用處理程序函數。例如,如果我向 發送 post 請求"/api/jim",即使"/api"已處理,我也會收到 404 錯誤。我想讓我的應用程序保持原樣(在處理程序中引用數據庫),但也能夠處理不完全匹配的路由。問題:假設我可以創建一個新的 ServeMux 來處理不完全匹配的路由,但是我如何將它與具有對數據庫連接的引用的類型 Handler Struct 組合起來?type Handler struct{  DB *DB}func main() {    fmt.Println("Hello, playground")    db, err := sql.Open("postgres", dbinfo)    defer db.Close()    h := &Handler{      DB: db,    }    log.Fatal(http.ListenAndServe(":8888", h))}func (h *Handler)ServeHTTP(w http.ResponseWriter, r *http.Request){    switch r.URL.Path{        case "/":        h.serveRoot(w, r)        case "/api/":        h.apiRouter(w, r)    }}func (h *Handler)serveRoot(w http.ResponseWriter, r *http.Request){        h.DB.DoSomethingWithDB()}func (h *Handler)apiRouter(w http.ResponseWriter, r *http.Request){       switch r.URL.Path{           case "/":               h.serveRoot(w, r)           case "/api/":               h.apiRouter(w, r)       }}更新 由于與問題無關的原因,我不能使用 DefaultServeMux
查看完整描述

1 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

自定義處理程序結構,一個ServeMux,一個HandlerFunc和第三方路由器的所有類型http.Handler。您可以根據需要對它們進行組合和分層。


由于 ServeMux 是一個處理程序,您可以像任何其他處理程序一樣將其分配給一個路徑,并為各種處理程序注冊單獨的路徑。這是使用多個的示例http.ServeMux(如果您選擇,可以在單獨的包中定義)。這有 3 個單獨的處理程序(通過 a 定義HandlerFunc),通過 2 路由ServeMux。


這里我們在包“路由器”中創建了一個 ServeMux


var Sub = http.NewServeMux()


func subHandler(w http.ResponseWriter, r *http.Request) {

    fmt.Println("handled / in /sub")

    w.Write([]byte("/sub/\n"))

}    


func init() {

    Sub.HandleFunc("/", subHandler)

}

現在我們可以從“路由器”導入 ServeMux,并在我們的頂級處理程序中使用它,以及其他一些:


import "router"


func rootHandler(w http.ResponseWriter, r *http.Request) {

    fmt.Println("handled /")

    w.Write([]byte("/\n"))

}


func topHandler(w http.ResponseWriter, r *http.Request) {

    fmt.Println("handled /top")

    w.Write([]byte("/top/\n"))

}

func main() {


    mux := http.NewServeMux()

    mux.HandleFunc("/", rootHandler)

    mux.HandleFunc("/top/", topHandler)


    // now insert the Sub routes under "/top/sub/"

    mux.Handle("/top/sub/", http.StripPrefix("/top", router.Sub))


    server := &http.Server{Addr: ":9999", Handler: mux}

    log.Fatal(server.ListenAndServe())

}

您選擇如何注冊這些取決于您,通過像這樣在main包中導入和路由它們,或者通過一些其他注冊模式(例如database/sql驅動程序)。


也不乏 3rd 方路由包來使這更容易、更高的性能或提供更高級的模式匹配方法。


查看完整回答
反對 回復 2021-11-08
  • 1 回答
  • 0 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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