大猩猩/ mux中的PathPrefix()和Handle(pathString,...)之间有什么区别?

时间:2018-07-03 19:58:33

标签: go gorilla

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

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

并且:

r.Handle("/api", APIHandler)

有什么区别?

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

PathPrefix()返回具有Handler()方法的路由。但是,我们不能在路由器上呼叫Handler(),而必须呼叫Handle()

看下面的例子:

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

我正在尝试从公共目录提供静态文件。上面的表达式可以正常工作。我的HTML和JavaScript可以按预期提供。但是,一旦我在路径中添加了一些内容,例如

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

然后我在localhost:<port>/home上收到404(未找到)错误。

1 个答案:

答案 0 :(得分:2)

路由器与路线

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

请注意,所有与Router方法返回名称相同的Route方法都是Router.NewRoute()的包装,这将返回注册到{ {1}}个实例。

为进行比较,当您在现有Route实例上调用此类方法时,它将为链接方法调用返回相同的实例。

PathPrefix()与Path()

使用Router指定路径时,它的末尾有一个隐式通配符。

来自the overview section of the documentation的引用:

  

请注意,提供给PathPrefix()的路径表示一个“通配符”:调用PathPrefix(“ / static /”)。Handler(...)意味着该处理程序将被传递给任何与“ / static / *相匹配的请求” “。

另一方面,当您使用Route指定路径时,没有这样的隐式通配符后缀。

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.

请注意,这与呼叫PathPrefix()和随后呼叫Path()的情况不一样,因为Router.PrefixPath()不提供通配符后缀。

通过带有前缀的路径提供文件

对于最后一个示例,请尝试更改:

Route.Handler

收件人:

Router.Handle()

否则,它会尝试提供来自r.PathPrefix("/home").Handler(http.FileServer(http.Dir(dir+"/public"))) 的文件

the documentation, halfway through the overview中就是一个例子。