echo学习 - yellia1989/learn-doc GitHub Wiki

路由的分类

  1. 固定路径 /users/new
  2. 带参数路径 /users/:id
  3. 匹配所有 /users/1/files/*

路由组的作用

相同的路径前缀可以放在一组,配合中间件使用可以定义统一的效果,例如鉴权

路由的原理

路由的查询算法采用radix tree实现

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)
    }