ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Go 从零开始(三)路由器 gorilla/mux

2022-06-28 13:02:39  阅读:137  来源: 互联网

标签:http mux gorilla products Go HandleFunc NewRouter 路由


HttpRouter 速度快,但是功能单一。

gorilla/mux 功能比较丰富。

 

一、下载安装

执行 go get -u github.com/gorilla/mux

 

二、定义映射到程序的路由

1、请求的 URL 精确匹配到路由时,执行对应的程序。

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    r.HandleFunc("/products", ProductsHandler)
    r.HandleFunc("/articles", ArticlesHandler)
    http.Handle("/", r)
}

 

2、匹配变量,可以用正则匹配

r := mux.NewRouter()
r.HandleFunc("/products/{key}", ProductHandler)
r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)

在程序中用 mux.Vars() 取得路由中的变量

func ArticlesCategoryHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Category: %v\n", vars["category"])
}

 

3、匹配域名

r := mux.NewRouter()
r.HandleFunc("/products/{key}", ProductHandler).Host("www.example.com")
r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler).Host("{subdomain:[a-z]+}.example.com")

 

4、匹配路由前缀

r := mux.NewRouter()
r.HandleFunc("/products/{key}", ProductHandler).PathPrefix("/products/")

 

5、匹配请求方式

r.HandleFunc("/products", ProductsHandler).
  Host("www.example.com").
  Methods("GET")

 

6、匹配域名类型 http、https 等

r.HandleFunc("/products", ProductsHandler).
  Host("www.example.com").
  Methods("GET").
  Schemes("http")

 

7、匹配 Header 信息

r.Headers("X-Requested-With", "XMLHttpRequest")
r.HeadersRegexp("Content-Type", "application/(text|json)")

 

8、自定义匹配规则

r.MatcherFunc(func(r *http.Request, rm *RouteMatch) bool {
    return r.ProtoMajor == 0
})

 

三、路由分组

相同域名的路由分组 ↓

r := mux.NewRouter()
s := r.Host("www.example.com").Subrouter()

s.HandleFunc("/products/", ProductsHandler)
s.HandleFunc("/products/{key}", ProductHandler)
s.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)

相同前缀的路由分组 ↓

r := mux.NewRouter()
s := r.PathPrefix("/products").Subrouter()
// "/products/"
s.HandleFunc("/", ProductsHandler)
// "/products/{key}/"
s.HandleFunc("/{key}/", ProductHandler)
// "/products/{key}/details"
s.HandleFunc("/{key}/details", ProductDetailsHandler)

 

四、路由命名

r := mux.NewRouter()
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler).
  Name("article")

用 name 获取上面定义的路由(/articles/technology/42

url, err := r.Get("article").URL("category", "technology", "id", "42")

获取 host 和 path

// "http://news.example.com/"
host, err := r.Get("article").URLHost("subdomain", "news")

// "/articles/technology/42"
path, err := r.Get("article").URLPath("category", "technology", "id", "42")

 

五、中间件

func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // Do stuff here
        log.Println(r.RequestURI)
        // Call the next handler, which can be another middleware in the chain, or the final handler.
        next.ServeHTTP(w, r)
    })
}

// 路由中追加中间件
r := mux.NewRouter()
r.HandleFunc("/", handler)
r.Use(loggingMiddleware)

 

六、URL 最后面的斜线处理

URL 后面有没有斜线,都希望匹配到相同路由。

调用 StrictSlash(value bool) 函数。

router := mux.NewRouter().StrictSlash(true)

 

标签:http,mux,gorilla,products,Go,HandleFunc,NewRouter,路由
来源: https://www.cnblogs.com/rendd/p/16417059.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有