默认服务器多路复用器如何匹配 url 模式
Posted
技术标签:
【中文标题】默认服务器多路复用器如何匹配 url 模式【英文标题】:How does default server mux match url pattern 【发布时间】:2019-03-18 05:06:32 【问题描述】:我见过使用以下代码从请求路径中提取 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
的行为方式吗?
【问题讨论】:
看看这个怎么样? ***.com/questions/30474313/….ServeMux
如何匹配路径在其文档中进行了描述:golang.org/pkg/net/http/#ServeMux
【参考方案1】:
最好的解释是官方的解释,在documentation for the http
package 中找到。部分:
模式名称固定,有根路径,如“/favicon.ico”,或有根子树,如“/images/”(注意尾部斜杠)。较长的模式优先于较短的模式,因此如果同时为“/images/”和“/images/thumbnails/”注册了处理程序,则会为以“/images/thumbnails/”开头的路径调用后一个处理程序,而前者将接收对“/images/”子树中任何其他路径的请求。
请注意,由于以斜杠结尾的模式命名了根子树,因此模式“/”匹配其他注册模式不匹配的所有路径,而不仅仅是路径 ==“/”的 URL。
与往常一样,如果您需要更多详细信息,请阅读文档。
【讨论】:
以上是关于默认服务器多路复用器如何匹配 url 模式的主要内容,如果未能解决你的问题,请参考以下文章
五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O