【问题标题】:Is it not possible to have path parameter in the middle of a path w/ Gorilla Mux?在带有 Gorilla Mux 的路径中间不可能有路径参数吗?
【发布时间】:2021-05-04 14:29:36
【问题描述】:

我有以下创建端点的 API 服务器 sn-ps,我想将“clusterID”抽象为处理程序中的路径参数。这是路由器部分

func main() {
    router := mux.NewRouter().StrictSlash(true)
    sub := router.PathPrefix("/api/v1").Subrouter()
    sub.Methods("GET").Path("/device/{clusterID}/job").HandlerFunc(authDev(getJob))
    ... 

下面是处理程序的 sn-p。我像往常一样使用mux.Vars() 获得变量。如果我向localshost/api/v1/device/cluster123/job 发送请求,处理程序将按预期调用,但mux.Vars(r) 返回一个空映射,而不是按预期返回带有clusterID=cluster123 的映射。 Mux 不支持路径中间的变量吗?我知道我可以手动解析路径,但我希望 Mux 会为我做这件事。

func getJob(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    log.Println(params["clusterID"]) // outputs an empty string
    log.Println(params) // outputs an empty map
    ...

【问题讨论】:

  • 你能发布 authDev() 的外观并最终尝试不使用它吗?
  • 这很有趣,当我比较来自@mkopriva 的解决方案时,我正在考虑这个问题,这与我已经拥有的几乎相同——接受中间件身份验证功能。然后,我阅读了您的问题并且灯熄灭了,我记得我需要将路由变量作为上下文从授权方传递给处理程序。谢谢。如果你想把它写成一个解决方案,我很乐意选择它。
  • 我认为要么接受 mkopriva 的回答,要么自己写解释问题所在,然后自我接受,这都很好。我真的没有答案,只是预感从 authDev() 将 request/vars 向下传递给 getJob() 函数存在问题。

标签: go gorilla mux


【解决方案1】:

在带有 Gorilla Mux 的路径中间不可能有路径参数吗?

是的。

Mux 不支持路径中间的变量吗?

是的,确实如此。

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "net/http"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/device/{clusterID}/job", getJob)
    http.ListenAndServe(":8000", r)
}

func getJob(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    fmt.Println(params["clusterID"])
    fmt.Println(params)
}
curl http://localhost:8000/device/123/job

输出:

123
map[clusterID:123]

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 2014-09-08
    • 2015-04-05
    • 1970-01-01
    • 2017-09-11
    • 2021-05-03
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多