概述
一些名词:
- REST: 表述性状态转移
- RESTful架构 :符合REST的约束条件和原则
- 资源与URI:任何事物,有被引用到的必要,就是资源
- URI:资源的地址或名称,资源必须有URI
- 统一资源接口:无论怎么的资源,都是通过使用相同的接口进行访问:
- 幂等:一个方法的任意多次执行所产生的影响与一次执行的影响相同
- 采用标准HTTP方法:GET、POST、PUT、DELETE
http标准包 :golang开发web框架的原材料;
重要部件:Server(服务器对象)、Conn(connection对象)、Handler(路由器)
编程逻辑:新建路由规则(实现Handler接口的ServerHTTP方法),启动server,建立http连接
【注】实现某接口:若某个类型提供了某接口中所定义的所有方法,则可以说:某类型实现了某接口
gin如何整合http包:
在engine中实现了ServerHTTP方法。根本上来说,是gin实现了一个功能强大的Handler
所有请求由ServeHTTP方法中的handleHTTPRequest进行处理,然后分发。
运行流程:
r := gin.Default()
初始化并返回了一个Engine对象
router := engine.Group("/v1")
返回了一个RouterGroup对象,RouterGroup对象中包含了一个Engine对象
router.Use(casbins.AuthCheck())
向之前的RouterGroup对象的Handlers字段添加了中间件提供的方法
router.GET("/reload", Reload)
↑ 调用 ↓
group.handle("GET", relativePath, handlers)
↑ 调用 ↓
group.engine.addRoute(httpMethod, absolutePath, handlers)
↑ 调用 ↓
root.addRoute(path, handlers)
最后向engine.trees字段中添加一个节点,完成路由的注册
r.Run()
↑ 调用 ↓
http.ListenAndServe(address, engine)
【疑问】:
在http包的使用时,路由最后被注册到了DefaultServeMux.m字段中,并且在收到请求时也从这里查找路由。而gin则是把路由存放到了他的engine.trees字段中,那么收到请求时,系统怎么知道去哪里寻找路由呢?
【猜测】:
DefaultServeMux和engine本质上都是个handler,源码中有写到,若没有传入handler时,则使用DefaultServeMux。那也就是说在开始的时候。engine是作为handler被注册了的,系统收到一个请求后,发现有一个注册的handler,那么就使用了这个handler而不再使用DefaultServeMux。路由的寻找使用的方法应该是实现了某接口(这个接口也被DefaultServeMux实现了),这样就能保证虽调用的方法名一致,但由于内部实现不同,所以可以从engine.trees中读取路由。
【解决】:
带着问题读源码效果好多了,默认使用的ServeMux和gin所使用的engine都实现了Handler接口的ServeHTTP方法。在后者的ServeHTTP方法中调用了handleHTTPRequest方法,其中发现了engine.trees的身影。
最后
以上就是风中歌曲为你收集整理的Gin 源码学习笔记的全部内容,希望文章能够帮你解决Gin 源码学习笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复