默认服务器多路复用器如何匹配 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

python I/O 多路复用

架构IO多路复用

架构IO多路复用

11-IO多路复用-paramiko-MySQL

IO多路复用机制详解