如何使用Gorilla Mux创建带有可选URL变量的路由?

10
我希望路由中有一个可选的URL变量,但是我使用mux包时似乎找不到方法。这是我的当前路由:

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/view/{id:[0-9]+}", MakeHandler(ViewHandler))
    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}

当url为 localhost:8080/view/1 时,它能起作用。我希望即使没有 id,也能接受这个url,这样如果我输入 localhost:8080/view ,它仍然能起作用。您有什么想法?

3个回答

10

使用想要的路径再次注册处理程序:

r.HandleFunc("/view", MakeHandler(ViewHandler))

在获取变量时,请确保检查以下情况:

vars := mux.Vars(r)
id, ok := vars["id"]
if !ok {
  // directory listing
  return
}
// specific view

5
您可以为根路径 /view 定义一个新的HandleFunc:
r.HandleFunc("/view", MakeHandler(RootHandler))

并让RootHandler函数执行您所需的路径操作。


1

在编写ViewHandler函数时,你可以使用字符?来表示id:[0-9]+模式是可选的,并处理是否在函数中传递了id

main

func main() {
  r := mux.NewRouter()
  r.HandleFunc("/view/{id:[0-9]+?}", MakeHandler(ViewHandler))
  http.Handle("/", r)
  http.ListenAndServe(":8080", nil)
}

ViewHandler:

func ViewHandler(w http.ResponseWriter, r *http.Request) {
  vars := mux.Vars(r)
  id := vars["id"]
  if id == "" {
      fmt.Println("there is no id")
  } else {
      fmt.Println("there is an id")
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接