Golang Web伺服器自訂路由

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

What you are wasting today is tomorrow for those who died yesterday; what you hate now is the future you can not go back.

你所浪費的今天是昨天死去的人奢望的明天; 你所厭惡的現在是未來的你回不去的曾經。

     最近公司有一個項目不算大,但是流量預計不小,分配到我這來了,要求快速上線,由於本人研究Golang兩個多月(本人愚鈍),加上對GOlang的癡迷,考慮偷偷的(其實是項目總監被我說服了)使用go來寫web服務。 看到這我只能說,瞎扯淡啥!!

      上菜:

        首先自訂路由的前提是路由對象實現ServeHTTP方法

        自訂路由寫法一:

                1. 路由結構體對象定義

type Router struct {Route map[string]map[string]http.HandlerFunc}

  Route屬性的類型是map , 其中一維的鍵String表示請求method比如post, get 等。二維的鍵string表示

要匹配的URL地址, http.HandlerFunc當然就是處理URL請求的具體方法。

                2. URL路由表初始化

// 路由表初始化func (r *Router) HandleFunc(method, path string, f http.HandlerFunc) {method = strings.ToUpper(method)if r.Route == nil {r.Route = make(map[string]map[string]http.HandlerFunc)}if r.Route[method] == nil {r.Route[method] = make(map[string]http.HandlerFunc)}r.Route[method][path] = f}

當然首先要初始化Map,有幾個就初始化幾個,  否則就會報錯哦。初始化後,調用方就可以使用

route.HandleFunc("GET", "/", HomeHandler)

此種方式初始化路由表了。

           3. 實現路由核心處理ServeHTTP方法

func (r *Router) ServeHTTP(res http.ResponseWriter, req *http.Request) {// 此處我做個很多關於http請求header的限制,一級業務版本處理,就不公布出來了    // ....// 正常路由if f, ok := r.Route[req.Method][req.URL.Path]; ok {f(res, req)//靜態檔案路由} else if strings.HasPrefix(req.URL.String(), staticHttpPath){staticFile := http.StripPrefix(staticHttpPath, http.FileServer(http.Dir(staticDirPath)))staticFile.ServeHTTP(res, req)// 404友好處理}else {// 由於此項目目的是提供介面和WEB HTML服務,所以此處本人做了一系列的url處理}}

    另外本人還根據業務做了一些關於web伺服器的友好調用處理,比如開啟關閉header檢測, 服務下線上線處理等等。如果各位親愛的【碼友】還有其他好的建議,請賜教.^_^

    

            自訂路由寫法二: 

此寫法類似與MVC

            1. 定義控制器結構體對象

type UrlHandlerController struct {Function func(http.ResponseWriter, *http.Request)Method   stringPattern  string}

           Pattern就是要匹配的URL地址。

            2. 定義路由對象

var mux []UrlHandlerController

             調用方在調用過程中就會是用 mux = append(mnx, UrlHandlerController{ XXXFUNC,  "POST", "/index" }) 此種方式調用初始化路由表。

            3. 定義路由對象

type httpHandler struct{}

             4.實現路由核心邏輯

func (*httpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {    // 當然無法避免的Header頭處理檢測// t := time.Now()    // 此處有一個不好的寫法就是 UrlHandlerController變數最好不要跟已存在的類型重名,否則........for _, UrlHandlerController := range mux {if m, _ := regexp.MatchString(UrlHandlerController.Pattern, r.URL.Path); m {if r.Method == UrlHandlerController.Method {UrlHandlerController.Function(w, r)// 做一些日誌等的處理return}}}    // 此處做需要根據項目做一個具體的最佳化處理:個人建議io.WriteString(w, "")return}

其實核心的處理就是簡單的尋找路由地址, 找到了就請求改地址的處理方法。

如果碼友們有好的建議,請留下你的痕迹

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.