首页 > 后端开发 > Golang > Gin 请求流程源码分析

Gin 请求流程源码分析

发布: 2023-08-04 17:26:13
转载
1091 人浏览过

标准库的http服务

Handler接口就可以注册到标准库的http server中。然后就会启动一个web应用。http请求流程当发生一个http请求的时候,在内部处理的流程是下面这样的:开启一个协程进行请求处理在conn.serve中调用serverHandler.ServeHTTP 函数如果有自己注册的Handle,那么就会调用注册的Handle的ServeHTTP 方法。这里还要注意的2个点如果自己在启动的时候没有注册自己的Handle,那么会采用标准库默认的ServeMux,全局名称为DefaultServeMux。如果请求URI为*并且请求Method为OPTIONS,那么Handle行为会被改成默认的globalOptionsHandler。上述分析的源码为GO 1.18.3。Gin 处理请求的流程前面我们看到只要注册自己的Handle接口到标准库就可以接管请求的处理;那么我们来看一下gin的Handle接口实现。在gin中,handleHTTPRequest就是匹配路径和对应handle 的处理函数。流程大致是这样:获取请求的路径在trees中找到对应的methodTree
登录后复制
  • methodTree中匹配对应路径的处理函数handle
    登录后复制
  • 通过Next方法执行注册的函数
    Next方法执行注册的函数
  • Gin 的 Context 源码

    在执行注册的函数之前我们发现在ServeHTTP方法中使用到了一个sync.Pool,它其实就是对gin.Context的复用。

    Gin 请求流程源码分析

    我们来看一下它的结构:

    // Context is the most important part of gin. It allows us to pass variables between middleware,
    // manage the flow, validate the JSON of a request and render a JSON response for example.
    type Context struct {
     writermem responseWriter
     Request   *http.Request
     Writer    ResponseWriter
    
     Params   Params
     handlers HandlersChain
     index    int8
     fullPath string
    
     engine       *Engine
     params       *Params
     skippedNodes *[]skippedNode
    
     // This mutex protects Keys map.
     mu sync.RWMutex
      ...
    }
    登录后复制

    官方的reqresp都会保存在Context 中。并且gin自己增加了对官方http.ResponseWriter功能的扩展,也就是自己定义了一个接口gin.ResponseWriter

    Gin 的 Context 源码

    在执行注册的函数之前我们发现在ServeHTTP方法中使用到了一个sync.Pool,它其实就是对gin.Context的复用。

    Gin 请求流程源码分析
    🎜我们来看一下它的结构:🎜rrreee🎜官方的reqresp都会保存在Context 中。并且gin自己增加了对官方http.ResponseWriter功能的扩展,也就是自己定义了一个接口gin.ResponseWriter🎜🎜其他的一些方法都是对日常使用的一些封装,方便开发。🎜

    Context 的 Bind 类方法分析

    Gin 请求流程源码分析

    在源码中可以看到一共支持这些的Binding;其中的实现就是反序列化,具体的就不在一个一个的说了。Binding;其中的实现就是反序列化,具体的就不在一个一个的说了。

    重点是在bind 完成后有一个validate的方法,它其实是采用的github.com/go-playground/validator/v10作为验证数据的库。

    Gin 请求流程源码分析

    并采用懒加载的方式进行初始化,也就是说不用,不会初始化这个对象。

    Gin 请求流程源码分析

    其中验证数据的开发流程,请查看validator[1] 的详细用法。

    ginmode.go文件中有控制一些行为的存在,比如DisableBindValidation

    重点是在bind 完成后有一个validate的方法,它其实是采用的github.com/go-playground/validator/v10作为验证数据的库。🎜🎜Gin 请求流程源码分析🎜🎜并采用懒加载的方式进行初始化,也就是说不用,不会初始化这个对象。🎜🎜Gin 请求流程源码分析🎜🎜其中验证数据的开发流程,请查看validator🎜[1] 的详细用法。🎜🎜在ginmode.go文件中有控制一些行为的存在,比如DisableBindValidation 就可以关闭数据验证功能,是在服务启动之前调用该方法即可关闭。🎜
    Gin 请求流程源码分析

    ginS 文件夹

    这个文件夹里面定义了一个默认的内部全局gin.Engine对象。gin.Engine对象。

    Gin 请求流程源码分析

    并且也是采用懒加载的方式来进行初始化的。

    Gin 请求流程源码分析

    所以对于想使用全局的gin.Engine可以采用这个包,这样你就可以不用保存一个自己的全局gin.Engine

    Gin 请求流程源码分析
并且也是采用懒加载的方式来进行初始化的。🎜🎜Gin 请求流程源码分析🎜🎜所以对于想使用全局的gin.Engine可以采用这个包,这样你就可以不用保存一个自己的全局gin.Engine对象了。🎜🎜🎜

以上是Gin 请求流程源码分析的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
gin
来源:Golang菜鸟
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板