环境:
Golang:go1.18.2 linux/amd64
gorilla/mux:v1.8.0
1. 简介
gorilla/mux
就是一个路由分发器,可以将每一个request分发到指定的handler。当请求路径中有参数时,通过定义{name}
或者{name: pattern}
(pattern就是一个正则表达式,如果匹配不成功,就不能将该request成功地分发)这样的格式来进行提取
2. 安装gorilla/mux
go get -u github.com/gorilla/mux
3. 示例
3.1 首先新建一个project,并启用gomodule
mkdir gorillaMux && cd gorillaMux && go mod init shannont/gorillamux
3.2 新建main.go,new一个Router
r := mux.NewRouter()
3.3 通过定义{name}
的格式来提取路径中的book,通过定义{name: pattern}
的格式来提取路径的page,最后通过HandleFunc()
将路径和handler映射
r.HandleFunc("/books/{title}/page/{page:[0-9]+}", func(w http.ResponseWriter, r *http.Request) {
//这里vars其实是一个map[string]string
vars := mux.Vars(r)
title := vars["title"]
page := vars["page"]
fmt.Fprintf(w, "You've requested the book: %s on page %s\n", title, page)
})
3.4 启用服务
http.ListenAndServe(":80", r)
注:关于net/http
中的基础函数的用法可以参考【Golang | Web】构建Web服务器
3.5 运行一下程序,打开浏览器,访问http://127.0.0.1:80/books/gostudy/page/88
,得到如下结果
如果pattern格式不匹配就会使request分发失败,在浏览器中输入http://127.0.0.1:80/books/gostudy/page/a
,得到结果如下
3.6 完整代码
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
func main() {
//新建一个Router
r := mux.NewRouter()
//路由分发
r.HandleFunc("/books/{title}/page/{page:[0-9]+}", func(w http.ResponseWriter, r *http.Request) {
//这里vars其实是一个map[string]string
vars := mux.Vars(r)
fmt.Println(vars)
title := vars["title"]
page := vars["page"]
fmt.Fprintf(w, "You've requested the book: %s on page %s\n", title, page)
})
//开启监听
http.ListenAndServe(":80", r)
}
4. 总结
- 通过
{name}
或者{name: pattern}
匹配路径中的参数 - 通过
mux.Vars()
将路径中的参数存储到map中