【go项目01_学习记录03】

发布于:2024-05-07 ⋅ 阅读:(25) ⋅ 点赞:(0)

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 不支持此功能。

1.5 http.ServeMux 的优缺点

在这里插入图片描述