echo学习 - yellia1989/learn-doc GitHub Wiki
路由的分类
- 固定路径 /users/new
- 带参数路径 /users/:id
- 匹配所有 /users/1/files/*
路由组的作用
相同的路径前缀可以放在一组,配合中间件使用可以定义统一的效果,例如鉴权
路由的原理
路由的查询算法采用radix tree实现
![]()
这是echo实现采用的数据结构
Router struct {
tree *node
routes map[string]*Route
echo *Echo
}
node struct {
kind kind
label byte
prefix string
parent *node
children children
ppath string
pnames []string
methodHandler *methodHandler
}
kind uint8
children []*node
methodHandler struct {
connect HandlerFunc
delete HandlerFunc
get HandlerFunc
head HandlerFunc
options HandlerFunc
patch HandlerFunc
post HandlerFunc
propfind HandlerFunc
put HandlerFunc
trace HandlerFunc
report HandlerFunc
}
中间件的原理
所有的中间件连在一起就是一条调用链,和Use调用的顺序一致
中间件和路由怎么配合
h := NotFoundHandler
if e.premiddleware == nil {
e.findRouter(r.Host).Find(r.Method, getPath(r), c)
h = c.Handler()
h = applyMiddleware(h, e.middleware...)
} else {
h = func(c Context) error {
e.findRouter(r.Host).Find(r.Method, getPath(r), c)
h := c.Handler()
h = applyMiddleware(h, e.middleware...)
return h(c)
}
h = applyMiddleware(h, e.premiddleware...)
}
// Execute chain
if err := h(c); err != nil {
e.HTTPErrorHandler(err, c)
}