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

Quellcode-Analyse des Gin-Anfrageprozesses

Golang菜鸟
Golang菜鸟nach vorne
2023-08-04 17:26:131109Durchsuche

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
  • methodTree中匹配对应路径的处理函数handle
  • 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
      ...
    }

    官方的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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Golang菜鸟. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen