Rumah >pembangunan bahagian belakang >Golang >Analisis kod sumber proses permintaan gin
http perkhidmatan perpustakaan standard
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
Seterusnya
Kaedah melaksanakan fungsi berdaftarNext
方法执行注册的函数在执行注册的函数之前我们发现在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
Sebelum melaksanakan fungsi berdaftar, kami mendapati bahawa dalam ServeHTTP
kaedah menggunakan sync.Pool
, yang sebenarnya gin.Context
guna semula.
req
dan resp
akan disimpan dalam Konteks
. dangin
menambah sokongan untuk http.ResponseWriter
sambungan fungsi, iaitu, mentakrifkan antara muka sendirigin.ResponseWriter
🎜🎜Sesetengah kaedah lain ialah enkapsulasi untuk kegunaan harian untuk memudahkan pembangunan. 🎜Anda boleh lihat dalam kod sumber bahawa sejumlah daripada ini disokong Mengikat
; Pelaksanaannya ialah penyahserialisasian, dan saya tidak akan memperincikan satu persatu. Binding
;其中的实现就是反序列化,具体的就不在一个一个的说了。
重点是在bind
完成后有一个validate
的方法,它其实是采用的github.com/go-playground/validator/v10
作为验证数据的库。
并采用懒加载的方式进行初始化,也就是说不用,不会初始化这个对象。
其中验证数据的开发流程,请查看validator[1] 的详细用法。
在gin
的mode.go
文件中有控制一些行为的存在,比如DisableBindValidation
bind
Selepas selesai terdapat github.com/go-playground/validator/v10
sebagai perpustakaan untuk mengesahkan data. 🎜🎜🎜🎜Dan gunakan pemuatan malas, ini bermakna tidak perlu membuat permulaan. objek tidak akan dimulakan. 🎜🎜🎜🎜Untuk proses pembangunan data, sila semak gin
'smode.go
mempunyai kawalan untuk beberapa gelagat, seperti DisableBindValidation
boleh mematikan fungsi pengesahan data. Kaedah ini boleh dimatikan dengan memanggil kaedah ini sebelum perkhidmatan dimulakan. 🎜Folder ini mentakrifkan dalaman lalai global gin. Enjin
objek. gin.Engine
对象。
并且也是采用懒加载的方式来进行初始化的。
所以对于想使用全局的gin.Engine
可以采用这个包,这样你就可以不用保存一个自己的全局gin.Engine
gin.Engine
boleh menggunakan pakej ini, jadi anda tidak perlu menyimpan Atas ialah kandungan terperinci Analisis kod sumber proses permintaan gin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!