我已经看到了使用以下代码从请求路径中提取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
的行为吗。
答案 0 :(得分:4)
最好的解释是在documentation for the http
package中找到的官方解释。部分:
模式命名固定的,有根的路径(例如“ /favicon.ico”)或有根的子树(例如“ / images /”)(请注意末尾的斜杠)。较长的模式优先于较短的模式,因此,如果同时为“ / images /”和“ / images / thumbnails /”注册了处理程序,则将为从“ / images / thumbnails /”开始的路径调用后一个处理程序将在“ / images /”子树中接收对任何其他路径的请求。
请注意,由于以斜杠结尾的模式会命名一个有根的子树,因此模式“ /”会匹配其他注册模式不匹配的所有路径,而不仅仅是具有Path ==“ /”的URL。
和往常一样,如果您需要更多详细信息,请阅读文档。