Heim > Backend-Entwicklung > Golang > Quellcode-Analyse des Gin-Anfrageprozesses

Quellcode-Analyse des Gin-Anfrageprozesses

Freigeben: 2023-08-04 17:26:13
nach vorne
1087 Leute haben es durchsucht

http-Dienst der Standardbibliothek

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
Nach dem Login kopieren
  • methodTree中匹配对应路径的处理函数handle
    Nach dem Login kopieren
  • By Nächste Methode führt registrierte Funktion aus
    Next方法执行注册的函数
  • Gin 的 Context 源码

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

    Quellcode-Analyse des Gin-Anfrageprozesses

    我们来看一下它的结构:

    // 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
      ...
    }
    Nach dem Login kopieren

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

    Gins Kontext-Quellcode

    Bevor wir die registrierte Funktion ausführten, stellten wir fest, dass in ServeHTTP-Methode verwendet eine sync.Pool, was eigentlich gin.Context wiederverwenden.

    Quellcode-Analyse des Gin-Anfrageprozesses
    🎜Werfen wir einen Blick auf die Struktur: 🎜rrreee🎜Officialreq und resp wird in Kontext. undgin hat Unterstützung für die offizielle http.ResponseWriter Funktionserweiterung, das heißt, Sie definieren selbst eine Schnittstellegin.ResponseWriter🎜🎜Einige andere Methoden sind Kapselungen für den täglichen Gebrauch, um die Entwicklung zu erleichtern. 🎜

    Context's Bind-Klassenmethodenanalyse

    Quellcode-Analyse des Gin-Anfrageprozesses

    Sie können im Quellcode sehen, dass insgesamt diese unterstützt werden Binding; Die Implementierung ist Deserialisierung, und ich werde nicht einzeln auf Details eingehen. Binding;其中的实现就是反序列化,具体的就不在一个一个的说了。

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

    Quellcode-Analyse des Gin-Anfrageprozesses

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

    Quellcode-Analyse des Gin-Anfrageprozesses

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

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

    Der entscheidende Punkt ist bind Nach der Fertigstellung gibt es einen validate-Methode, die tatsächlich <code style="font-size: 14px; verwendet -wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;color: #1e6bb8;background-color: rgba(27,31,35,.05);font-family: Operator Mono , Consolas, Monaco, Menlo, monospace;word-break: break-all;">github.com/go-playground/validator/v10 als Bibliothek zur Validierung von Daten. 🎜🎜Quellcode-Analyse des Gin-Anfrageprozesses🎜🎜Und verwenden Sie Lazy Loading zum Initialisieren, was bedeutet, dass dies nicht erforderlich ist Das Objekt wird nicht initialisiert. 🎜🎜Quellcode-Analyse des Gin-Anfrageprozesses🎜🎜Für den Entwicklungsprozess der Datenüberprüfung überprüfen Sie bitte validator🎜[1] . 🎜🎜Ingin'smode.go-Datei verfügt über Steuerelemente für einige Verhaltensweisen, wie z. B. DisableBindValidation kann die Datenvalidierungsfunktion deaktivieren. Diese Methode kann deaktiviert werden, indem diese Methode vor dem Start des Dienstes aufgerufen wird. 🎜
    Quellcode-Analyse des Gin-Anfrageprozesses

    ginS-Ordner

    Dieser Ordner definiert einen standardmäßigen internen globalen gin. Engine-Objekt. gin.Engine对象。

    Quellcode-Analyse des Gin-Anfrageprozesses

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

    Quellcode-Analyse des Gin-Anfrageprozesses

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

    Quellcode-Analyse des Gin-Anfrageprozesses
Und es wird auch mit Lazy Loading initialisiert. 🎜🎜Quellcode-Analyse des Gin-Anfrageprozesses🎜🎜Also für diejenigen, die globale gin.Engine kann dieses Paket verwenden, Sie müssen also keinen globalen gin.Engine object. 🎜🎜🎜

Das obige ist der detaillierte Inhalt vonQuellcode-Analyse des Gin-Anfrageprozesses. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
gin
Quelle:Golang菜鸟
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage