学习记录
- 1 路由http.ServeMux
- 1.1 查看HandleFunc方法源码
- 1.2 查看ListenAndServe方法源码
- 1.3 重构:使用自定义的 ServeMux
- 1.4 http.ServeMux 的局限性
- 1.4.1 URI 路径参数
- 1.4.2 请求方法过滤
- 1.4.3 不支持路由命名
- 1.5 http.ServeMux 的优缺点
1 路由http.ServeMux
1.1 查看HandleFunc方法源码
- pattern 是 URI 的规则,例如 / 或者 about
- handler 是供调用的函数
1.2 查看ListenAndServe方法源码
handler 通常为 nil,此种情况下会使用 DefaultServeMux
1.3 重构:使用自定义的 ServeMux
1.4 http.ServeMux 的局限性
http.ServeMux 在 goblog 中使用,会遇到以下几个问题:
- 不支持 URI 路径参数
- 不支持请求方法过滤
- 不支持路由命名
1.4.1 URI 路径参数
r.URL.Path:r是http.Request类型的参数,表示HTTP请求。r.URL是一个url.URL类型的结构体,其中包含了请求的URL信息。r.URL.Path表示请求的路径部分,即URI路径。
strings.SplitN(r.URL.Path, “/”, 3):strings.SplitN函数用于按照指定的分隔符将字符串分割成多个子串,并返回一个切片。在这里,我们使用"/“作为分隔符,将URI路径按”/"进行分割。第二个参数3表示最多分割成3个子串。这里会将URI路径分割成三部分。
[2]:表示从分割后的切片中获取第三个元素,索引从0开始。在这里,我们获取了分割后的切片中的第三个元素,即文章的ID。
id := strings.SplitN(r.URL.Path, “/”, 3)[2]:将获取到的文章ID赋值给变量id。这样就可以从URI路径参数中提取出文章的ID。
fmt.Fprint(w, “文章ID:”+id):最后,使用fmt.Fprint函数将文章ID作为字符串拼接到输出流w(http.ResponseWriter)中,返回给客户端。
1.4.2 请求方法过滤
无法直接从路由上区分 POST 或者 GET 等 HTTP 请求方法,只能手动判断
CURL测试:
1.4.3 不支持路由命名
路由命名是一套允许我们快速修改页面里显示 URL 的机制。
例如URL 是
http://example.com/books/{id}
项目随着时间的推移,变得非常巨大,在几十个页面里都存在这个 URI 。突然有个需求或者有其他不可控因素,要求我们修改链接为:
http://example.com/novels/{id}
那么我们只能到这个几十个页面里去修改。
使用路由命名的话,我们为 books/{id} 这个路由命名为 articles.show,几十个页面在编码时,都使用这个路由名称而不是具体的 URI,遇到修改的需求时,我们只需在定义路由这一个地方修改即可。
目前 http.ServeMux 不支持此功能。