gorilla/mux 中的 PathPrefix() 和 Handle(pathString, ...) 有什么区别?

What is the difference between PathPrefix() and Handle(pathString, ...) in gorilla/mux?

我注意到在 gorilla/mux router 中有两种指定路径的方法:

r.PathPrefix("/api").Handler(APIHandler)

并且:

r.Handle("/api", APIHandler)

有什么区别?

此外,我不明白 gorilla/mux 上下文中路由器和路由之间的区别。

PathPrefix() returns 一条路线,其中有一个 Handler() 方法。但是,我们不能在路由器上调用Handler(),我们必须调用Handle()

看下面的例子:

r.PathPrefix("/").Handler(http.FileServer(http.Dir(dir+"/public")))

我正在尝试从 public 目录提供静态文件。上面的表达式没有任何问题。我的 HTML 和 JavaScript 按预期提供。但是,一旦我在路径中添加了一些东西,例如

r.PathPrefix("/home").Handler(http.FileServer(http.Dir(dir+"/public")))

然后我在 localhost:<port>/home.

上收到 404,未找到错误

路由器与路由

Router 是一个容器,您可以在其中注册多个 Route 实例。 Route 接口主要复制在 Router 上,以便在 Router 中轻松创建 Route 实例。

请注意,所有与 Route 方法同名的 Router 方法都是 Router.NewRoute() 的包装器,其中 returns 一个新的 Route 注册到 Router 实例。

为了比较,当您在现有 Route 实例上调用此类方法时,它 returns 用于链接方法调用的同一实例。

PathPrefix() 与 Path()

当您使用 PathPrefix() 指定路径时,它在末尾有一个隐式通配符。

引自the overview section of the documentation

Note that the path provided to PathPrefix() represents a "wildcard": calling PathPrefix("/static/").Handler(...) means that the handler will be passed any request that matches "/static/*".

另一方面,当您使用 Path() 指定路径时,没有这种隐含的通配符后缀。

Router.Handle() 与 Router.Path().Handler()

Router.Handle() is a shortcut for, and therefore equivalent to, executing Router.Path() followed by a call to Route.Handler() on the returned Route.

请注意,这与先调用 Router.PrefixPath() 再调用 Route.Handler 不同,因为 Router.Handle() 不提供通配符后缀。

从具有前缀的路径提供文件

对于你的最后一个例子,尝试改变:

r.PathPrefix("/home").Handler(http.FileServer(http.Dir(dir+"/public")))

收件人:

r.PathPrefix("/home/").Handler(http.StripPrefix("/home/", http.FileServer(http.Dir(dir+"/public"))))

否则,它会尝试提供来自 dir + "/public" + "/home/"

的文件

the documentation, halfway through the overview.

中有一个例子