猿问

mux 在 url 中有空参数

我有这个主要的:


func main() {

    r := _routerprovider.GetRouter()

    srv := &http.Server{

        Handler:      r,

        Addr:         "127.0.0.1:8000",

        WriteTimeout: 60 * time.Second,

        ReadTimeout:  15 * time.Second,

    }

    fmt.Println("Running in port 8000!")

    err := srv.ListenAndServe()

    if err != nil {

        log.Fatalln(err.Error())

    }

}

这是路由器:


func (h HandlerProvider) GetRouter() *mux.Router {

    r := mux.NewRouter()

    r.HandleFunc("/health", Health).Methods("GET")

    r.HandleFunc("/users", GetUsers).Methods("GET")

    r.HandleFunc("/users", CreateUser).Methods("POST")

    r.HandleFunc("/people", GetPeople).Methods("GET")

    r.HandleFunc("/peoplebyid", GetPeopleByID).Methods("GET")

    return r

}

无论我做什么,mux.Vars 总是返回一个空地图。我究竟做错了什么?这是一个示例处理程序:


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

    params := mux.Vars(r)

    id, ok := params["id"]

    if !ok {

        ErrorHandler(w, r, fmt.Errorf("Error!"), 400)

        return

    }

    idasnumber, err := strconv.Atoi(id)

    if err != nil {

        ErrorHandler(w, r, fmt.Errorf("Error!"), 400)

        return

    }

    value, ok := services.PeopleDict[idasnumber]


    bs, _ := json.MarshalIndent(value, "", "  ")

    w.Write(bs)

}


HUH函数
浏览 119回答 1
1回答

翻翻过去那场雪

mux.Vars()仅在路由匹配时才会填充(因此 Gorilla mux 知道在哪里寻找它们)。路由中的匹配是通过在路由中预期变量值的地方使用或者{name}或占位符来完成的。{name:pattern}所以对于以下路线:r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)您将拥有 vars 键category并id使用它们各自的值进行设置:vars := mux.Vars(r)fmt.Fprintf(w, "Category: %v\n", vars["category"])fmt.Fprintf(w, "Id: %v\n", vars["id"])在您的代码中,您可以修复/peoplebyid这种方式(取决于 id 是什么)以使您的GetPeopleById()处理程序工作:func (h HandlerProvider) GetRouter() *mux.Router {// ...r.HandleFunc("/people/{id:[0-9]+}", GetPeopleByID).Methods("GET")// ...}有关如何在此处使用 vars 的信息,请参阅 Gorilla Mux 文档:https ://github.com/gorilla/mux#examples ,特别是以以下开头的部分:路径可以有变量。它们使用 {name} 或 {name:pattern} 格式定义。如果未定义正则表达式模式,则匹配的变量将是任何东西,直到下一个斜杠。
随时随地看视频慕课网APP

相关分类

Go
我要回答