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

参考