如何使用gorilla mux创建一个可选url变量的路由?

qhhrdooz  于 2023-03-10  发布在  Go
关注(0)|答案(3)|浏览(99)

我想在路由中有一个可选的URL变量。我似乎找不到使用多路复用包的方法。下面是我当前的路由:

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也能接受,这样如果我输入localhost:8080/view它仍然可以工作。

but5z9lq

but5z9lq1#

使用所需路径再次注册处理程序:

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

只是要确保当你得到你的VAR,你检查这个案例:

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

xxb16uws2#

您可以为根/view路径定义一个新的HandleFunc

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

并让RootHandler函数执行该路径所需的任何操作。

9gm1akwq

9gm1akwq3#

您可以使用?字符来指示id:[0-9]+模式是可选的,并在ViewHandler函数中无论是否传递了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")
  }
}

相关问题