Gorilla Mux的基础使用和常用功能
gorilla/mux一个良好质量的Http路由器和Url匹配器,很好补充net/http包HTTP协议复杂的路由请求。本文主要记录gorilla的基础使用、和常用功能提取网址参数、路径前缀和子路由器、中间件。
基础使用
安装
go get -u github.com/gorilla/mux
创建路由器
通过 mux.NewRouter() 创建路由器,稍后将作为参数传递给服务器。它将接收所有 HTTP 连接并将其传递给您将在其上注册的请求处理程序。
package main
import (
"fmt"
"github.com/gorilla/mux"
"net/http"
)
func main() {
//创建一个新的路由器
r := mux.NewRouter()
//等效于http.HandleFunc()工作原理
r.HandleFunc("/foo", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "foo")
})
//等效于http.Handler()工作原理
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("bar")
fmt.Fprintf(w, "bar")
}))
r.Handle("/foo", handler)
//作为服务参数传入
http.ListenAndServe(":80", r)
}
//请求http://yourip:80/foo http://yourip:80/bar
//output
//foo bar
网址参数
gorilla/mux的优势之一是:从url中提前参数,例如一个restful api:/country/{country}/province/{province} ,从request参数
oneHander := func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
c := vars["country"]
p := vars["province"]
fmt.Printf("Welcome to %s %s\n", c, p)
fmt.Fprintf(w, "Welcome to %s %s\n", c, p)
}
//URL 中提取段/变量
r.HandleFunc("/country/{country}/province/{province}", oneHander)
//请求 http://yourip/country/china/province/fujian
//output
//Welcome to china fujian
路径前缀和子路由器
有些场景将请求处理程序限制为特定路径前缀,比如api、admin、cheat 或 v1、v2、v3 或 beta 、prod。
allHanler := func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
c := vars["country"]
p := vars["province"]
fmt.Fprintf(w, "Welcome to %s %s\n", c, p)
}
//路径前缀和子路由器
countryRouter := r.PathPrefix("/country").Subrouter()
countryRouter.HandleFunc("/", allHanler)
countryRouter.HandleFunc("/{province}", oneHander)
//请求 http://yourip/country/china
//output
//Welcome to china
中间件
Mux 支持向Router添加中间件,如果找到匹配项,中间件将按照添加的顺序执行,包括其子路由器。
func Middleware1(r *mux.Router) mux.MiddlewareFunc {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
fmt.Println("do something before handler")
next.ServeHTTP(w, req)
fmt.Println("do something after handler")
})
}
}
//中间件
middleware1 := Middleware1(r)
r.Use([]mux.MiddlewareFunc{middleware1}...)
//请求 http://yourip/country/china/province/fujian
//output
//do something before handler
//Welcome to china fujian
//do something after handler