【GoCN酷Go推荐】Go Web 路由处理利器 gorilla/mux 库

GoCN

共 4908字,需浏览 10分钟

 ·

2021-05-24 16:15

gorilla/mux 简介

gorilla/mux 是用来处理路由请求和请求对应的方法的映射关系的包,简单地说,gorilla/mux 就是把收到的请求与一组预先定义的 URL 路径列表做对比,然后在匹配到路径的时候调用关联的处理器(Handler)。

为什么那么受欢迎?


gorilla/mux  在标准库 net/http 之上开发的,因此 gorilla/mux 比较能干,标准能干的也能干,不能干的也能干;标准库在运行效率上占优,gorilla/mux 在开发效率上占优;,gorilla/mux 是目前功能最为强大的路由包之一,它提供功能全面而强大,这也是它连续多年成为使用率最高的 Go 第三方包的原因。

什么时候用到它?

gorilla/mux 的路由解析所采用的是精准匹配规则,标准库 net/http 采用的是长度优先匹配规则,精准匹配是只会匹配准确指定的路由,而长度优先匹配不支持动态元素,也就是不支持正则以及 URL 路径参数,只能匹配字符数较多的路由;开发 Web,API 时路由一般时动态的,路由参数会跟着访问对象不同而不同,这是 gorilla/mux 恰好满足了这种精准路由匹配需求。

在知名的路由包中 gorilla/mux 的功能比较强大,使用相对简单且很实,历史也非常悠久,可以放心去使用。

怎么使用?


使用前要安装它,安装要在当前项目所在目录中执行 go get -u github.com/gorilla/mux 即可。

安装完写一个 Web 应用示例:

package main

import (
 "fmt"
 "net/http"

 "github.com/gorilla/mux"
)

func homeHandler(w http.ResponseWriter, r *http.Request) {
 fmt.Fprint(w, "<h1>This is homePage!</h1>")
}

func articlesIndexHandler(w http.ResponseWriter, r *http.Request) {
 fmt.Fprint(w, "<h1>This is articlesIndexPage!</h1>")
}

func notFoundHandler(w http.ResponseWriter, r *http.Request) {
 fmt.Fprint(w, "<h1>This is notFoundPage</h1>")
}

func articlesShowHandler(w http.ResponseWriter, r *http.Request) {
 //mux 提供 mux.Vars(r) 的方法会将 URL 路径参数解析为 Map, key 是路由参数,value 是参数对应的值,
 vars := mux.Vars(r)
 id := vars["id"]
 fmt.Fprint(w, "<h1>This articles‘s ID:"+id+"</h1>")
}

func articlesStoreHandler(w http.ResponseWriter, r *http.Request) {
 //获取表单中传输的数据方式有 r.ParseForm, ParseFormValue 等,具体如下:
 //r.ParseForm() 是由标准库 http 包提供的,从请求中解析请求参数,必须是执行完这段代码,
 //再用 r.PostForm 和 r.Form 来获取到数据,不事先 r.ParseForm() 来解析时获取不到数据。
 err := r.ParseForm()
 if err != nil {
  fmt.Fprint(w, "请在表单中填写数据再提交!")
  return
 }

 title := r.PostForm.Get("title")
 content := r.PostForm.Get("content")
 author := r.PostForm.Get("author")
 fmt.Fprintf(w, "title 的值为: %v", title)
 fmt.Fprintf(w, "content 的值为: %v", content)
 fmt.Fprintf(w, "author 的值为: %v", author)

 //PostForm 只能能读取 post、put 方式传输的参数,在使用之前需要调用 ParseForm 方法。
 fmt.Fprintf(w, "POST PostForm: %v <br>", r.PostForm)
 //Form 能读取 post、put 和 get 方式传输的参数,在使用之前必须调用 ParseForm 方法来解析路由
 fmt.Fprintf(w, "POST Form: %v <br>", r.Form)
 //  直接获取想要的参数,则直接使用 r.PostFormValue() 方法即可,无需调用 ParseForm 方法来解析路由
 fmt.Fprintf(w, "r.Form() 中 title 的值为: %v <br>", r.FormValue("title"))
 fmt.Fprintf(w, "r.PostForm() 中 title 的值为: %v <br>", r.PostFormValue("title"))
}


func main() {
 //注册路由
 router := mux.NewRouter()

 //精准匹配的
 router.HandleFunc("/", homeHandler).Methods("GET").Name("home")
 router.HandleFunc("/articles/{id:[0-9]+}", articlesShowHandler).Methods("GET").Name("articles.show")
 router.HandleFunc("/articles", articlesIndexHandler).Methods("GET").Name("articles.index")
 router.HandleFunc("/articles/{id:[0-9]+}", articlesStoreHandler).Methods("GET").Name("articles.store")

 //未匹配到路由时匹配到 notFoundHandler
 router.NotFoundHandler = http.HandlerFunc(notFoundHandler)

 //监听路由
 http.ListenAndServe(":6060", router)
}

写完示例,执行 go run main.go 启动 Web 服务;再用 Postman 来访问一下 url 即可看到返回结果。

  • GET 方式访问 localhost:6060/
  • GET 方式访问 localhost:6060/articls
  • GET 方式访问 localhost:6060/articles/2
  • POST 方式访问 localhost:6060/articles

以上的所以路由中用到了路由别名 router.HandleFunc(_, _).Methods("GET")..Name("别名")' ,除此之外在articlesIndexHandler).Methods("GET").Name("articles.index") router.HandleFunc("/articles/{id:[0-9]+}", ` 中用到了动态路由,也就是 id 不一样展示的对象也不一样。

除了提供 Web 开发常用功能之外,gorilla/mux 包还提供其他一些功能,比如,域名绑定,路由分组,路由绑定前缀,路由中间件等,看具体业务需求选择性使用即可。


总结


gorilla/mux 库是历史悠久,从使用文档齐全、其质量和社区活跃度都很 nice,多年 Go 趋势报告中指出 gorilla/mux 是整个社区使用率最高的第三方库,占据 36% 的市场份额。

gorilla/mux 使用方式简单,扩展性好,功能强大且全面,也可以根据自身业务需要对它进行定制化的二次开发。

gorilla/mux 能大大提升 Web 应用开发效率,使用简单不粗暴。


参考资料



还想了解更多吗?

更多请查看:https://github.com/gorilla/mux

欢迎加入我们GOLANG中国社区:https://gocn.vip/


《酷Go推荐》招募:


各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到

新的库,并且知道怎么用。


大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!(报名地址:https://wj.qq.com/s2/7734329/3f51)


扫码也可以加入 GoCN 的大家族哟~


 Gopher China2021大会日程详情来了!



浏览 54
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报