golang常用库:gorilla/mux-http路由库使用
golang常用库:配置文件解析库-viper使用
golang常用库:操作数据库的orm框架-gorm基本使用

一:golang自带路由介绍

golang自带路由库 http.ServerMux ,实际上是一个 map[string]Handler,是请求的url路径和该url路径对于的一个处理函数的映射关系。这个实现比较简单,有一些缺点:

不支持参数设定,例如/user/:uid 这种泛型类型匹配无法很友好的支持REST模式,无法限制访问方法(POST,GET等)也不支持正则

二:gorilla/mux路由

github地址:https://github.com/gorilla/mux
http://www.gorillatoolkit.org/pkg/mux
https://github.com/gorilla/mux#examples

上面所指出来的glang自带路由的缺点,gorilla/mux 都具备,而且还兼容 http.ServerMux。除了支持路径正则,命名路由,还支持中间件等等功能。所以mux是一个短小精悍,功能很全的路由。

1. 普通路由

示例 demo1.go

上面mux的普通路由是不是似曾相识,跟golang标准库用法一样

在浏览器访问:http://localhost:8080/products
输出:hello, Products

2. 参数路由

参数路由,可以是普通路由,还可以是正则匹配
示例 demo2.go:

404 page not found

3. 路由匹配Matching Routes

https://github.com/gorilla/mux#matching-routes
我们也可以限制路由或者子路由。

3.1 匹配host

3.2 更多的一些其他匹配

见下面的更多匹配的例子:

把上面的联合起来在一个单独的route里

3.3 子路由匹配

Subrouter()可以设置子路由

3.4 多个路由匹配的顺序

如果有多个路由添加到路由器里面,那么匹配顺序是怎么样?按照添加的先后顺序匹配。比如有2个路由都匹配了,那么优先匹配第一个路由。

4. 设置路由前缀

PathPrefix()设置路由前缀

路由前缀一般情况下不会单独使用,而是和子路由结合起来用,实现路由分组

5. 分组路由

可以根据前面的子路由和路由前缀的功能,综合运用就可以设置分组路由了
实例:grouprouter.go

6. 路由中间件

https://github.com/gorilla/mux#middleware
Mux middlewares are defined using the de facto standard type: 在mux中路由中间件的定义

type MiddlewareFunc func(http.Handler) http.Handler

示例1:middleware1.go

示例2:middleware2.go

在来看一个复杂点的例子:

用 insomnia 软件测试,如下图:


X-Session-Token=aaa 返回时正确


那-Session-Token=aaaa 呢


返回 403 了

7. Walking Routes 遍历注册的所有路由

8. 其他示例

请求方法限制

demo3.go:

请求头限制

在路由定义中可以通过Headers() 方法来限制设置请求头的匹配。
demo4.go

自定义匹配规

用 MatcherFunc() 来自定义规则
示例 demo5.go:**

在浏览器中:http://127.0.0.1:8080/products/matcher?func=matcherfunc
输出:FormValue: matcherfunc

命名路由Registered URLs

namerouter.go

根据命名的路由来获取路由URLr.Get("product").URL()

三:参考

https://github.com/gorilla/mux