這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前言
為了讓golang的路由更加清晰,讓路由的代碼可讀性更好,我們採用mux包去實現路由,並且在原有功能上做了精簡
該系列文章所有代碼放在這裡
開始
所需的包github.com/gorilla/mux
我們在啟動http服務時設定一下路由的配置方法
func startHttp() { if err := http.ListenAndServe(":9090", api.NewAPIMux()); err != nil { log.Fatal("ListenAndServe: ", err) }}
配置方法
api包路由的配置方法有兩種,一種是api的配置,另一種的靜態資源的配置(不需要為靜態資源再開一台nginx)
func NewAPIMux() *mux.Router { r := mux.NewRouter() s := r.PathPrefix("/api").Subrouter() initUserApi(s) r.PathPrefix("/").Handler(http.StripPrefix("/", http.FileServer(http.Dir("web/")))) return r}
api配置
這裡的api配置,是通過mux的首碼功能,把/api開頭的的請求都認為是api請求,並且引出子路由,這是用mux最大的目的
我們來看看userapi的初始化的方法裡都做什麼,當然最好單獨一個檔案寫userapi的代碼,比如user.go
func initUserApi(r *mux.Router) { s := r.PathPrefix("/user").Subrouter() s.HandleFunc("/list", UserListHandler) s.HandleFunc("/add", UserAddHandler)}func UserListHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("user list"))}func UserAddHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("user add"))}
簡單精鍊,匹配了/api/user下的所有請求,並單獨處理/api/user/list和/api/user/add
同理,一樣的product,order都可以這麼寫,代碼會非常清晰,簡單精鍊,
靜態檔案配置
r.PathPrefix("/").Handler(http.StripPrefix("/", http.FileServer(http.Dir("web/"))))
嗯,就這麼簡單的一句,將除了api之外的所有請求匯入到web目錄下,以靜態檔案的方式處理,不再需要啟動nginx,apache之類的去處理
這就是我喜歡golang的地方,更多去操作業務本身,而不是一直敲重複的代碼