首頁 > 後端開發 > Golang > 主體

Gin 請求流程原始碼分析

發布: 2023-08-04 17:26:13
轉載
1077 人瀏覽過

標準函式庫的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方法執行註冊的函數
  • 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

    #其他的一些方法都是對日常使用的一些封裝,方便開發。

    Context 的Bind 類別方法分析

    Gin 請求流程原始碼分析

    #在原始碼中可以看到總共支援這些的Binding ;其中的實現就是反序列化,具體的就不在一個一個的說了。

    重點是在bind 完成後有一個validate的方法,它其實是採用的github.com/go-playground/validator/v10作為驗證資料的庫。

    Gin 請求流程原始碼分析

    並且採用懶加載的方式初始化,也就是說不用,不會初始化這個物件。

    Gin 請求流程原始碼分析

    其中驗證資料的開發流程,請查看validator[1] 的詳細用法。

    ginmode.go檔案中有控制一些行為的存在,例如DisableBindValidation 就可以關閉資料驗證功能,是在服務啟動之前呼叫該方法即可關閉。

    Gin 請求流程原始碼分析

    ginS 資料夾

    這個資料夾裡面定義了一個預設的內部全域gin.Engine物件。

    Gin 請求流程原始碼分析

    並且也是採用懶載入的方式來進行初始化的。

    Gin 請求流程原始碼分析

    所以對於想使用全域的gin.Engine可以採用這個包,這樣你就可以不用保存一個自己的全域gin. Engine對象了。

#

以上是Gin 請求流程原始碼分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
gin
來源:Golang菜鸟
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板