你好,今天我想分享一下,在 Go 語言中串聯 HTTP 處理器。
在使用 Go 之前, 我使用 Nodejs + ExpressJS 去編寫 HTTP 服務器應用。 這個框架提供了很簡單的方法去使用中間件和串聯很多路由節點,因此,不必指定完整的路由路徑來為其添加處理程序。
這個想法是通過分割你的路由和處理每一個部分,串聯到處理器,每個處理程序只負責一部分。它理解起來非常簡單且非常容易使用和維護,所以首先我嘗試在 Go 中做一些類似的事情。
開箱即用, Go 提供了一個很棒的 http 包,它包含了很多不同的工具,當然, 還有 ListenAndServe 方法,它在給定的端口上啟動一個 HTTP 服務器并且通過 Handler 處理它,那么這個 Handler 是什么?
type Handler interface { ServeHTTP(ResponseWriter,*Request) }
Handler 是接口,它有一個方法 - ServeHTTP 去處理傳入的請求和輸出響應。
但是,如果我們想為每一個根路由定義一個處理程序,例如 /api/、/home、/about 等,要怎么做?
ServeMux - HTTP 請求復用器,可以幫助你處理這一點. 使用 ServeMux,我們可以指定處理器方法來服務任何給定的路由,但問題是我們不能做任何嵌套的 ServeMux。
文檔中的例子:
我們可以看到,在這個例子中為 /api/ 路由自定義了一個處理器并且定義了一個處理方法給根路由。因此任何以 /api/* 開頭的路由都將使用 apiHandler 處理器方法。 但是如果我們需要串聯一個 usersHandler 到 apiHandler,不通過任何的頭腦風暴和編碼,我們無法做到這點。
為此我寫了一個小庫 - gosplitter,它只提供一個公共方法 Match(url string, mux *http.ServeMux, http.Handler|http.HandlerFunc|interface{}) - 他匹配給定的路由部分和處理器、處理方法或你給定的任何結構!
讓我們來看一個例子:
舉個例子:
/** * 定義處理器類型 */ type APIV1Handler struct { mux *http.ServeMux } type ColorsHandler struct { mux *http.ServeMux }
這里我們定義了一個我們的處理器,它是一個結構體
添加一個 Start 方法到我們的處理器程序,去激活處理方法
添加 HandlePing 和 HandleBlack 到我們的 APIV1Handler,它響應了 pong 和 #000000
我們在 main 方法中創建了一個新的 ServeMux 然后創建了一個 APIV1Handler 的實例,把它綁定到了 /api/v1 路由,然后啟動了它。
所以在所有這些簡單的操作之后我們擁有了兩個工作中的路由: /api/v1/ping 和 /api/v1/colors/black,會響應 pong 和 #000000。
使用起來不是很容易么?我認為是這樣, 現在在我的項目中使用這個庫來方便的進行路由分割和串聯處理器
感謝閱讀,歡迎提出任何建議和批評!