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

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

獲取 Golang HTTP 或 Gorilla 包中的路由和參數列表

獲取 Golang HTTP 或 Gorilla 包中的路由和參數列表

Go
瀟湘沐 2022-01-10 16:32:50
當我像這樣編寫一個簡單的 Web 應用程序時:func handler(w http.ResponseWriter, r *http.Request) {    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])}func main() {    http.HandleFunc("/about", handler)    http.ListenAndServe(":8080", nil)}如何找到我在 Web 應用程序中定義的路線和參數列表?例如,在本例中查找“/about”。編輯1: 如何獲得這個參數和路線?gorilla.HandleFunc(`/check/{id:[0-9]+}`, func(res http.ResponseWriter, req *http.Request) {    res.Write([]byte("Regexp works :)"))})
查看完整描述

3 回答

?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

您可以使用http.DefaultServeMux(輸入ServeMux)并檢查它。使用reflect包,您可以ValueOf使用默認的多路復用器和提取m屬性,這是您的路線圖。


v := reflect.ValueOf(http.DefaultServeMux).Elem()

fmt.Printf("routes: %v\n", v.FieldByName("m"))

更新:


如果您使用net/http比您應該在您自己實際完成任何請求之前實現提取參數;否則你可以訪問參數r.URL.Query()


如果您使用的gorilla/mux不是elithrar提到的,您應該使用Walk:


功能主要:


r := mux.NewRouter()

r.HandleFunc("/path/{param1}", handler)


err := r.Walk(gorillaWalkFn)

if err != nil {

    log.Fatal(err)

}

功能 gorillaWalkFn:


func gorillaWalkFn(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {

    path, err := route.GetPathTemplate()

    return nil

}

該path變量包含您的模板:


“/路徑/{param1}”


但您應該手動提取參數。


查看完整回答
反對 回復 2022-01-10
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

您可以看到 HTTP 包中的路由列表。


http.HandleFunc("/favicon.ico", func(res http.ResponseWriter, req *http.Request) {

    http.ServeFile(res, req, "favicon.ico")

})

http.HandleFunc(`/check`, func(res http.ResponseWriter, req *http.Request) {

    res.Write([]byte("Regexp works :)"))

})


httpMux := reflect.ValueOf(http.DefaultServeMux).Elem()

finList := httpMux.FieldByIndex([]int{1})

fmt.Println(finList)


查看完整回答
反對 回復 2022-01-10
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

我想一個改進的答案。


它提供了缺失的一段代碼來從路由路徑模板字符串中提取參數。



var pathTemplateRegex = regexp.MustCompile(`\{(\\?[^}])+\}`)


func getRouteParams(router *mux.Router, route string) []string {

    r := router.Get(route)

    if r == nil {

        return nil

    }

    t, _ := r.GetPathTemplate()

    params := pathTemplateRegex.FindAllString(t, -1)

    for i, p := range params {

        p = strings.TrimPrefix(p, "{")

        p = strings.TrimSuffix(p, "}")

        if strings.ContainsAny(p, ":") {

            p = strings.Split(p, ":")[0]

        }

        params[i] = p

    }

    return params

}


查看完整回答
反對 回復 2022-01-10
  • 3 回答
  • 0 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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