[关闭]
@gzm1997 2018-07-04T08:18:06.000000Z 字数 2282 阅读 856

mux学习

mux


mux简介

mux implement了一个请求路由器和调度符合要求的输入请求到相应的视图函数中,mux是http request multiplexer 就是http多路复用器

mux的特点是


install

go get -u github.com/gorilla/mux

hello world

  1. package main
  2. import (
  3. "github.com/gorilla/mux"
  4. "net/http"
  5. "log"
  6. )
  7. func test(w http.ResponseWriter, r *http.Request) {
  8. w.Write([]byte("lalalala"))
  9. w.WriteHeader(http.StatusOK)
  10. }
  11. func main() {
  12. r := mux.NewRouter()
  13. //r.Host("localhost")
  14. r.HandleFunc("/test", test)
  15. log.Fatal(http.ListenAndServe("localhost:8080", r))
  16. }

基本使用

声明一个路由

r := mux.NewRouter()

注册视图函数

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

注意到上面的URL匹配那里是可以使用正则表达式来进行匹配变量的

视图函数编写

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

视图函数或者说handler都是两个默认参数

  1. w http.ResponseWriter
  2. r *http.Request

要注意第二http.request请求的参数指针类型的 不要写错 其它跟Java的servlet基本相同 使用writer讲返回内容输出到http response中 但是要注意视图函数都是void类型 没有返回值


路由匹配

匹配域名

r.Host("www.example.com")

匹配一个动态的子域名 可以使用正则

r.Host("{subdomain:[a-z]+}.domain.com")

匹配URL前缀

r.PathPrefix("/products/")

匹配http方法

r.Methods("GET", "POST")

匹配协议

r.Schemes("https")

匹配头部

r.Headers("X-Requested-With", "XMLHttpRequest")

匹配查询参数

r.Queries("key", "value")

使用客制匹配器

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

上面的各种匹配是可以一起声明的 向下面这样

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

mux路由匹配冲突问题

如果一个请求跟两个路由都匹配 这就造成了冲突 这时候第一个会被成功匹配


子路由

子路由不仅仅很方便 而且有利于优化代码

例子

  1. package main
  2. import (
  3. "github.com/gorilla/mux"
  4. "net/http"
  5. "log"
  6. )
  7. func test(w http.ResponseWriter, r *http.Request) {
  8. w.Write([]byte("lalalala"))
  9. w.WriteHeader(http.StatusOK)
  10. }
  11. func testSubRouter(w http.ResponseWriter, r *http.Request) {
  12. w.Write([]byte("this is subrouter page"))
  13. vars := mux.Vars(r)
  14. key := vars["key"]
  15. w.Write([]byte(key))
  16. w.WriteHeader(http.StatusOK)
  17. }
  18. func main() {
  19. r := mux.NewRouter()
  20. s := r.PathPrefix("/hello").Subrouter()
  21. s.HandleFunc("/{key}", testSubRouter)
  22. r.HandleFunc("/test", test)
  23. log.Fatal(http.ListenAndServe("localhost:8080", r))
  24. }

静态文件

静态文件在mux中一般使用static的url前缀来匹配 这样非常方便


未完待续!

参考链接

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注