【发布时间】: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() 函数存在问题。