【GoCN酷Go推薦】Go Web 路由處理利器 gorilla/mux 庫
gorilla/mux 簡介
gorilla/mux 是用來處理路由請求和請求對應(yīng)的方法的映射關(guān)系的包,簡單地說,gorilla/mux 就是把收到的請求與一組預(yù)先定義的 URL 路徑列表做對比,然后在匹配到路徑的時(shí)候調(diào)用關(guān)聯(lián)的處理器(Handler)。
為什么那么受歡迎?
gorilla/mux 在標(biāo)準(zhǔn)庫 net/http 之上開發(fā)的,因此 gorilla/mux 比較能干,標(biāo)準(zhǔn)能干的也能干,不能干的也能干;標(biāo)準(zhǔn)庫在運(yùn)行效率上占優(yōu),gorilla/mux 在開發(fā)效率上占優(yōu);,gorilla/mux 是目前功能最為強(qiáng)大的路由包之一,它提供功能全面而強(qiáng)大,這也是它連續(xù)多年成為使用率最高的 Go 第三方包的原因。
什么時(shí)候用到它?
gorilla/mux 的路由解析所采用的是精準(zhǔn)匹配規(guī)則,標(biāo)準(zhǔn)庫 net/http 采用的是長度優(yōu)先匹配規(guī)則,精準(zhǔn)匹配是只會(huì)匹配準(zhǔn)確指定的路由,而長度優(yōu)先匹配不支持動(dòng)態(tài)元素,也就是不支持正則以及 URL 路徑參數(shù),只能匹配字符數(shù)較多的路由;開發(fā) Web,API 時(shí)路由一般時(shí)動(dòng)態(tài)的,路由參數(shù)會(huì)跟著訪問對象不同而不同,這是 gorilla/mux 恰好滿足了這種精準(zhǔn)路由匹配需求。
在知名的路由包中 gorilla/mux 的功能比較強(qiáng)大,使用相對簡單且很實(shí),歷史也非常悠久,可以放心去使用。
怎么使用?
使用前要安裝它,安裝要在當(dāng)前項(xiàng)目所在目錄中執(zhí)行 go get -u github.com/gorilla/mux 即可。
安裝完寫一個(gè) Web 應(yīng)用示例:
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) 的方法會(huì)將 URL 路徑參數(shù)解析為 Map, key 是路由參數(shù),value 是參數(shù)對應(yīng)的值,
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) {
//獲取表單中傳輸?shù)臄?shù)據(jù)方式有 r.ParseForm, ParseFormValue 等,具體如下:
//r.ParseForm() 是由標(biāo)準(zhǔn)庫 http 包提供的,從請求中解析請求參數(shù),必須是執(zhí)行完這段代碼,
//再用 r.PostForm 和 r.Form 來獲取到數(shù)據(jù),不事先 r.ParseForm() 來解析時(shí)獲取不到數(shù)據(jù)。
err := r.ParseForm()
if err != nil {
fmt.Fprint(w, "請?jiān)诒韱沃刑顚憯?shù)據(jù)再提交!")
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 方式傳輸?shù)膮?shù),在使用之前需要調(diào)用 ParseForm 方法。
fmt.Fprintf(w, "POST PostForm: %v <br>", r.PostForm)
//Form 能讀取 post、put 和 get 方式傳輸?shù)膮?shù),在使用之前必須調(diào)用 ParseForm 方法來解析路由
fmt.Fprintf(w, "POST Form: %v <br>", r.Form)
// 直接獲取想要的參數(shù),則直接使用 r.PostFormValue() 方法即可,無需調(diào)用 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()
//精準(zhǔn)匹配的
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")
//未匹配到路由時(shí)匹配到 notFoundHandler
router.NotFoundHandler = http.HandlerFunc(notFoundHandler)
//監(jiān)聽路由
http.ListenAndServe(":6060", router)
}
寫完示例,執(zhí)行 go run main.go 啟動(dòng) Web 服務(wù);再用 Postman 來訪問一下 url 即可看到返回結(jié)果。
GET 方式訪問 localhost:6060/GET 方式訪問 localhost:6060/articlsGET 方式訪問 localhost:6060/articles/2POST 方式訪問 localhost:6060/articles
以上的所以路由中用到了路由別名 router.HandleFunc(_, _).Methods("GET")..Name("別名")' ,除此之外在articlesIndexHandler).Methods("GET").Name("articles.index")
router.HandleFunc("/articles/{id:[0-9]+}", ` 中用到了動(dòng)態(tài)路由,也就是 id 不一樣展示的對象也不一樣。
除了提供 Web 開發(fā)常用功能之外,gorilla/mux 包還提供其他一些功能,比如,域名綁定,路由分組,路由綁定前綴,路由中間件等,看具體業(yè)務(wù)需求選擇性使用即可。
總結(jié)
gorilla/mux 庫是歷史悠久,從使用文檔齊全、其質(zhì)量和社區(qū)活躍度都很 nice,多年 Go 趨勢報(bào)告中指出 gorilla/mux 是整個(gè)社區(qū)使用率最高的第三方庫,占據(jù) 36% 的市場份額。
gorilla/mux 使用方式簡單,擴(kuò)展性好,功能強(qiáng)大且全面,也可以根據(jù)自身業(yè)務(wù)需要對它進(jìn)行定制化的二次開發(fā)。
gorilla/mux 能大大提升 Web 應(yīng)用開發(fā)效率,使用簡單不粗暴。
參考資料
https://github.com/gorilla/mux 2021 Go 趨勢報(bào)告 Go 語言構(gòu)建 RESTful Web 服務(wù)
更多請查看:https://github.com/gorilla/mux
歡迎加入我們GOLANG中國社區(qū):https://gocn.vip/
《酷Go推薦》招募:
各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫或者好的項(xiàng)目,然后寫一點(diǎn)這個(gè)庫使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到
新的庫,并且知道怎么用。
大概規(guī)則和每日新聞?lì)愃?,如果?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名?。▓?bào)名地址:https://wj.qq.com/s2/7734329/3f51)
掃碼也可以加入 GoCN 的大家族喲~
Gopher China2021大會(huì)日程詳情來了!
