標準函式庫的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
方法執行註冊的函數在執行註冊的函數之前我們發現在ServeHTTP
方法中使用到了一個sync .Pool
,它其實就是對gin.Context
的複用。
我們來看看它的結構:
// 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 ... }
官方的req
和resp
都會保存在Context
中。並且gin
自己增加了對官方http.ResponseWriter
功能的擴展,也就是自己定義了一個接口gin.ResponseWriter
#其他的一些方法都是對日常使用的一些封裝,方便開發。
#在原始碼中可以看到總共支援這些的Binding
;其中的實現就是反序列化,具體的就不在一個一個的說了。
重點是在bind
完成後有一個validate
的方法,它其實是採用的github.com/go-playground/validator/v10
作為驗證資料的庫。
並且採用懶加載的方式初始化,也就是說不用,不會初始化這個物件。
其中驗證資料的開發流程,請查看validator[1] 的詳細用法。
在gin
的mode.go
檔案中有控制一些行為的存在,例如DisableBindValidation
就可以關閉資料驗證功能,是在服務啟動之前呼叫該方法即可關閉。
這個資料夾裡面定義了一個預設的內部全域gin.Engine
物件。
並且也是採用懶載入的方式來進行初始化的。
所以對於想使用全域的gin.Engine
可以採用這個包,這樣你就可以不用保存一個自己的全域gin. Engine
對象了。
以上是Gin 請求流程原始碼分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!