# gee **Repository Path**: illlloooovvvvcode/gee ## Basic Information - **Project Name**: gee - **Description**: go web框架 参考Gin实现 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: https://gitee.com/illlloooovvvvcode/gee/settings#index - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-06-05 - **Last Updated**: 2022-07-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Gee ---web框架 参考Gin框架的核心实现 - 支持GET,POST请求方法 - 支持路由分组 通过前缀树来实现 - 支持动态路由 - 支持中间件 - 支持模板匹配 - 支持JSON数据格式的对象绑定 ## 如何将HTTP请求流入web框架 1. 任何实现ServeHTTP方法的对象就是实现了都可以处理HTTP请求 2. 需要在执行http.ListenAndServe时,将自己的对象handler作为参数传入,这时,再有HTTP请求来时,该对象就可以截获http请求,在自己实现的ServeHTTP方法进行处理。 ## 如何实现路由到handler的映射 map key:method-router ==> value: handler 开发的时候注册 填充这个map 执行的时候通过 map中的key拿到handler执行 ## Context有什么用 Context伴随着http请求而产出,一个请求,就会有一个Context,存储与该请求相关众多信息。 - Context封装了http**请求和响应**的内容 - 构建HTML/String/JSON方法,实现快速构造HTTP响应 - 存储前端请求中的各种信息动态路由所对应的值 - 存储中间件 ## 在注册路由的时候构建前缀树 每一种HTTP方法对应着一个路由trie树 通过前缀树实现动态路由 路由通过”/“进行分割,前缀树中的除了根节点外的的每一个节点,都是路由的的一部分 注册路由==>建立路由trie树==>将保存 路由最后一部分的节点中添加上 整个路由,代表路由结束 最后将这个method+路由到handler的映射存储在map中。 查询路由==>遍历路由trie树==>找到路由中最后一部分对应的节点,取出 整个路由, 通同时获得动态路由对应的值,即可 最后获得的通过整个路由到map中匹配到handle ## 如何实现动态路由 通过前缀树查询到的节点中获得将整个匹配到的路由进行拆分,请求中的路由也进行拆分 遍历匹配路由,看是否包含`: *`,如果包含将对应的url中的路由中对应的值拿到保存在context中 ## 如何实现的分组路由 路由分组结构体,存储当前分组的前缀,以及分组支持的中间件 创建路由分组时,填入前缀(创建该分组的分组的前缀 + 该分组的前缀),支持的中间件,同时将该分组对象存储在engine的分组队列中 通过该分组创建路由到handler映射时,分组前缀+路由 作为路由构建路由树 用户请求时,首先遍历engine中的分组队列,查看用户请求中的路由匹配到分组前缀,如果匹配到,就将分组中的中间件放到context的中间件队列中,依次执行。 ## 如何实现中间件 Gee 的中间件的定义与路由映射的 Handler 一致,处理的输入是`Context`对象。插入点是框架接收到请求初始化`Context`对象后,允许用户使用自己定义的中间件做一些额外的处理 1. Context保存和请求强相关的信息。因此一次请求需要执行的中间件也应该保存在Context中。 2. 中间件是作用于RouterGroup的,由RouterGroup注册中间件,并保存在RouterGroup中。 3. 请求到来时,根据请求路由,在路由组中查找相关的中间件保存在Context中 4. 中间件的执行,中间件和handler本质相同,功能不同。通过c.Next()方法执行当前handler之后的handler,执行完之后,再接着执行之前的函数。 ## 静态文件 读取静态文件 通过r.Static()创建路由组定位到项目静态文件所在位置 创建相应静态文件handler 基于Static(relativePath, root string)创建handler 请求前缀为realtivePath的路由 响应 服务器上的 项目根目录root/资源 ## 如何实现绑定对象 浏览器在http报文中的body 存入json格式的对象,后端进行读取,绑定到与之对应的结构体上 ## 最后: 通过这个demo,对于Gin的实现,有了一点点的了解,但是对于具体的细节还是不够熟悉,还需要温习。