我注意到有两种方法可以在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(未找到)错误。
答案 0 :(得分:2)
Router
是一个容器,您可以在其中注册多个Route
实例。 Route
接口主要复制在Router
上,以方便在Route
中创建Router
实例。
请注意,所有与Router
方法返回名称相同的Route
方法都是Router.NewRoute()
的包装,这将返回注册到{ {1}}个实例。
为进行比较,当您在现有Route
实例上调用此类方法时,它将为链接方法调用返回相同的实例。
使用Router
指定路径时,它的末尾有一个隐式通配符。
来自the overview section of the documentation的引用:
请注意,提供给PathPrefix()的路径表示一个“通配符”:调用PathPrefix(“ / static /”)。Handler(...)意味着该处理程序将被传递给任何与“ / static / *相匹配的请求” “。
另一方面,当您使用Route
指定路径时,没有这样的隐式通配符后缀。
请注意,这与呼叫PathPrefix()
和随后呼叫Path()
的情况不一样,因为Router.PrefixPath()
不提供通配符后缀。>
对于最后一个示例,请尝试更改:
Route.Handler
收件人:
Router.Handle()
否则,它会尝试提供来自r.PathPrefix("/home").Handler(http.FileServer(http.Dir(dir+"/public")))
的文件