Go http 服务默认的路由规则和更好的路由
Go Default Router
1 2 3 4 5 6 7 8 9 10
| func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request){ handler := sh.srv.Handler if handler == nil { handler = DefaultServeMux // 使用缺省的Router } if req.RequestURI == “*” && req.Method == “OPTIONS” { handler = globlOptionsHandler{} } handler.ServeHTTP(rw,req) }
|
路由规则
- URL 分为两种,末尾是 /: 表示一个子树,后面可以跟其他的子路径;末尾不是 / ,表示一个叶子,固定的路径
以 /结尾的 URL 可以匹配它的任何子路径,比如 /images 回匹配 /images/cute-cat.jpg*
- 它采用最长匹配原则,如果多个匹配,一定采用匹配路径最长的那个进行处理
- 如果没有找到任何匹配项,会返回 404
更好的 Router
https://github.com/julienschmidt/httprouter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package main
import ( "fmt" "github.com/julienschmidt/httprouter" "net/http" "log" )
func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { fmt.Fprint(w, "Welcome!\n") }
func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name")) }
func main() { router := httprouter.New() router.GET("/", Index) router.GET("/hello/:name", Hello)
log.Fatal(http.ListenAndServe(":8080", router)) }
|