1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【GoCN酷Go推薦】Go Web 路由處理利器 gorilla/mux 庫(kù)

        共 4908字,需瀏覽 10分鐘

         ·

        2021-05-24 16:15

        gorilla/mux 簡(jiǎn)介

        gorilla/mux 是用來(lái)處理路由請(qǐng)求和請(qǐng)求對(duì)應(yīng)的方法的映射關(guān)系的包,簡(jiǎn)單地說(shuō),gorilla/mux 就是把收到的請(qǐng)求與一組預(yù)先定義的 URL 路徑列表做對(duì)比,然后在匹配到路徑的時(shí)候調(diào)用關(guān)聯(lián)的處理器(Handler)。

        為什么那么受歡迎?


        gorilla/mux  在標(biāo)準(zhǔn)庫(kù) net/http 之上開(kāi)發(fā)的,因此 gorilla/mux 比較能干,標(biāo)準(zhǔn)能干的也能干,不能干的也能干;標(biāo)準(zhǔn)庫(kù)在運(yùn)行效率上占優(yōu),gorilla/mux 在開(kāi)發(fā)效率上占優(yōu);,gorilla/mux 是目前功能最為強(qiáng)大的路由包之一,它提供功能全面而強(qiáng)大,這也是它連續(xù)多年成為使用率最高的 Go 第三方包的原因。

        什么時(shí)候用到它?

        gorilla/mux 的路由解析所采用的是精準(zhǔn)匹配規(guī)則,標(biāo)準(zhǔn)庫(kù) net/http 采用的是長(zhǎng)度優(yōu)先匹配規(guī)則,精準(zhǔn)匹配是只會(huì)匹配準(zhǔn)確指定的路由,而長(zhǎng)度優(yōu)先匹配不支持動(dòng)態(tài)元素,也就是不支持正則以及 URL 路徑參數(shù),只能匹配字符數(shù)較多的路由;開(kāi)發(fā) Web,API 時(shí)路由一般時(shí)動(dòng)態(tài)的,路由參數(shù)會(huì)跟著訪問(wèn)對(duì)象不同而不同,這是 gorilla/mux 恰好滿足了這種精準(zhǔn)路由匹配需求。

        在知名的路由包中 gorilla/mux 的功能比較強(qiáng)大,使用相對(duì)簡(jiǎn)單且很實(shí),歷史也非常悠久,可以放心去使用。

        怎么使用?


        使用前要安裝它,安裝要在當(dāng)前項(xiàng)目所在目錄中執(zhí)行 go get -u github.com/gorilla/mux 即可。

        安裝完寫(xiě)一個(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ù)對(duì)應(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)庫(kù) http 包提供的,從請(qǐng)求中解析請(qǐng)求參數(shù),必須是執(zhí)行完這段代碼,
         //再用 r.PostForm 和 r.Form 來(lái)獲取到數(shù)據(jù),不事先 r.ParseForm() 來(lái)解析時(shí)獲取不到數(shù)據(jù)。
         err := r.ParseForm()
         if err != nil {
          fmt.Fprint(w, "請(qǐng)?jiān)诒韱沃刑顚?xiě)數(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 方法來(lái)解析路由
         fmt.Fprintf(w, "POST Form: %v <br>", r.Form)
         //  直接獲取想要的參數(shù),則直接使用 r.PostFormValue() 方法即可,無(wú)需調(diào)用 ParseForm 方法來(lái)解析路由
         fmt.Fprintf(w, "r.Form() 中 title 的值為: %v <br>", r.FormValue("title"))
         fmt.Fprintf(w, "r.PostForm() 中 title 的值為: %v <br>", r.PostFormValue("title"))
        }


        func main() {
         //注冊(cè)路由
         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)聽(tīng)路由
         http.ListenAndServe(":6060", router)
        }

        寫(xiě)完示例,執(zhí)行 go run main.go 啟動(dòng) Web 服務(wù);再用 Postman 來(lái)訪問(wèn)一下 url 即可看到返回結(jié)果。

        • GET 方式訪問(wèn) localhost:6060/
        • GET 方式訪問(wèn) localhost:6060/articls
        • GET 方式訪問(wèn) localhost:6060/articles/2
        • POST 方式訪問(wèn) 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 不一樣展示的對(duì)象也不一樣。

        除了提供 Web 開(kāi)發(fā)常用功能之外,gorilla/mux 包還提供其他一些功能,比如,域名綁定,路由分組,路由綁定前綴,路由中間件等,看具體業(yè)務(wù)需求選擇性使用即可。


        總結(jié)


        gorilla/mux 庫(kù)是歷史悠久,從使用文檔齊全、其質(zhì)量和社區(qū)活躍度都很 nice,多年 Go 趨勢(shì)報(bào)告中指出 gorilla/mux 是整個(gè)社區(qū)使用率最高的第三方庫(kù),占據(jù) 36% 的市場(chǎng)份額。

        gorilla/mux 使用方式簡(jiǎn)單,擴(kuò)展性好,功能強(qiáng)大且全面,也可以根據(jù)自身業(yè)務(wù)需要對(duì)它進(jìn)行定制化的二次開(kāi)發(fā)。

        gorilla/mux 能大大提升 Web 應(yīng)用開(kāi)發(fā)效率,使用簡(jiǎn)單不粗暴。


        參考資料



        還想了解更多嗎?

        更多請(qǐng)查看:https://github.com/gorilla/mux

        歡迎加入我們GOLANG中國(guó)社區(qū):https://gocn.vip/


        《酷Go推薦》招募:


        各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類(lèi)似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫(kù)或者好的項(xiàng)目,然后寫(xiě)一點(diǎn)這個(gè)庫(kù)使用方法或者優(yōu)點(diǎn)之類(lèi)的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到

        新的庫(kù),并且知道怎么用。


        大概規(guī)則和每日新聞?lì)愃?,如果?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名?。▓?bào)名地址:https://wj.qq.com/s2/7734329/3f51)


        掃碼也可以加入 GoCN 的大家族喲~


         Gopher China2021大會(huì)日程詳情來(lái)了!



        瀏覽 68
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天天日天天射试看二分钟 | 台湾性生生活1 | 久久精品国产99国产精品 | 精品人妻无码一区二区三区91 | 舌头伸进去舔我的好爽高潮 | 婷婷爱五月天 | 毛片无码一区二区三区A片视频 | 亚洲中文免费 | 性猛交xxxx乱大交孕妇2 | 忘穿内裤被同桌摸到爽 |