默认服务器复用器如何匹配网址格式

时间:2019-03-18 05:06:32

标签: go mux

我已经看到了使用以下代码从请求路径中提取url参数的简单路由器实现。

handler := http.NewServerMux()
handler.HandleFunc('/user/', func(w http.ResponseWriter, r *http.Request) {
     name := strings.Replace(r.URL.Path, '/user/', "", 1)// this code

    io.WriteString(w, fmt.Sprintf("Hello %s\n",name)
})

然后它们将是另一条类似/user的路由(注意没有尾随斜杠)。

handler.HandleFunc('/user', handleUser)

比如说r.URL.Path/user/name。第一条路线将匹配,而第二条较短的路线将不匹配。从技术上讲,请求路径不应与任何路由相匹配,因为一个路径对于匹配而言太长而另一路径太短。

这引发了一个问题,即在将请求匹配到路由时,Golang mux遵循哪些规则。乍看起来,它正在采用路径的最长匹配,但是如果最短的路径首先在程序源中定义怎么办?

有人可以简单介绍一下ServerMux的行为吗。

1 个答案:

答案 0 :(得分:4)

最好的解释是在documentation for the http package中找到的官方解释。部分:

  

模式命名固定的,有根的路径(例如“ /favicon.ico”)或有根的子树(例如“ / images /”)(请注意末尾的斜杠)。较长的模式优先于较短的模式,因此,如果同时为“ / images /”和“ / images / thumbnails /”注册了处理程序,则将为从“ / images / thumbnails /”开始的路径调用后一个处理程序将在“ / images /”子树中接收对任何其他路径的请求。

     

请注意,由于以斜杠结尾的模式会命名一个有根的子树,因此模式“ /”会匹配其他注册模式不匹配的所有路径,而不仅仅是具有Path ==“ /”的URL。

和往常一样,如果您需要更多详细信息,请阅读文档。