Maison  >  Article  >  développement back-end  >  Explication détaillée du middleware du framework Gin et de son application

Explication détaillée du middleware du framework Gin et de son application

王林
王林original
2023-06-22 10:21:172429parcourir

Le framework Gin est un framework Web léger basé sur le langage Go. Il présente les avantages d'une efficacité élevée, d'une flexibilité et d'une évolutivité facile, et est apprécié par de nombreux développeurs. Le mécanisme middleware est un point fort du framework Gin. Dans cet article, nous explorerons en détail le mécanisme middleware du framework Gin et son application.

1. Qu'est-ce qu'un middleware ? Le middleware fait référence à un plug-in qui intercepte et réécrit la logique de traitement des requêtes et des réponses pendant le processus de traitement des requêtes réseau. En langage Go, le middleware est généralement implémenté à l’aide de types de fonctions. Le middleware du framework Gin est implémenté en transmettant ces fonctions comme paramètres formels aux fonctions qui gèrent les requêtes et les réponses.

Dans le framework Gin, le middleware est divisé en deux types : le middleware global et le middleware local. Le middleware global agit sur toutes les routes, tandis que le middleware local agit sur une certaine route ou groupe de routage.

2. Le mécanisme middleware du framework Gin

Le mécanisme middleware du framework Gin est très simple. Il vous suffit de transmettre le middleware en tant que type de fonction à la fonction qui gère la requête et la réponse.

Par exemple, le code suivant est un middleware simple :

func MyMiddleware() gin.HandlerFunc {
  return func(c *gin.Context) {
    // do something
    c.Next()
    // do something after
  }
}

Parmi eux, la fonction MyMiddleware définit une fonction middleware, qui renvoie un type de fonction. Le type de fonction renvoyé est la fonction qui gère les requêtes et les réponses, généralement appelée HandlerFunc.

HandlerFunc est défini comme suit : MyMiddleware函数定义了一个中间件函数,它返回一个函数类型。而返回的这个函数类型,就是处理请求和响应的函数,通常被称为HandlerFunc

HandlerFunc的定义如下:

type HandlerFunc func(*Context)

它接受一个*Context类型的参数,表示请求的上下文。*Context类型包含了请求中的各种信息,例如请求头、请求体、请求参数等。

在中间件函数中,我们可以对上下文进行操作,并调用c.Next()方法将控制权交给下一个中间件或路由处理函数。

例如,如果我们要在中间件中添加一个请求头,可以按照以下方式:

func AddHeader() gin.HandlerFunc {
  return func(c *gin.Context) {
    c.Header("X-Request-Id", "123456")
    c.Next()
  }
}

这个中间件会在请求中添加一个X-Request-Id头部,然后将控制权交给下一个处理函数。在路由处理函数中,我们可以通过c.GetHeader方法获取这个请求头的值。

三、Gin框架中的中间件使用

在Gin框架中,使用中间件非常简单。只需要将中间件函数传递给UseGETPOSTPUTDELETE等方法即可。例如:

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    // 使用全局中间件
    r.Use(MyGlobalMiddleware())

    // 定义路由组,并使用局部中间件
    v1 := r.Group("/v1")
    {
        v1.Use(AddHeader())
        v1.GET("/hello", Hello)
    }

    r.Run(":8080")
}

func MyGlobalMiddleware() gin.HandlerFunc {
  return func(c *gin.Context) {
    // do something
    c.Next()
    // do something after
  }
}

func AddHeader() gin.HandlerFunc {
  return func(c *gin.Context) {
    c.Header("X-Request-Id", "123456")
    c.Next()
  }
}

func Hello(c *gin.Context) {
    headers := c.Request.Header
    requestId := headers.Get("X-Request-Id")
    c.JSON(200, gin.H{
        "message": "hello",
        "request_id": requestId,
    })
}

上述代码中,我们使用了一个全局中间件MyGlobalMiddleware(),这个中间件会作用于所有路由之前。我们还使用了一个局部中间件AddHeader(),这个中间件只作用于/v1/hello这个路由之前。在Hello函数中,我们获取了X-Request-Id

r := gin.New()
r.Use(gin.Logger())

Il accepte un paramètre de type *Context, représentant le contexte de la requête. Le type *Context contient diverses informations dans la requête, telles que les en-têtes de requête, les corps de requête, les paramètres de requête, etc.

Dans la fonction middleware, nous pouvons opérer sur le contexte et appeler la méthode c.Next() pour transférer le contrôle au prochain middleware ou fonction de traitement de route.

Par exemple, si nous voulons ajouter un en-tête de requête dans le middleware, nous pouvons le faire comme suit :

r := gin.Default()
r.Use(gin.Recovery())

Ce middleware ajoutera un en-tête X-Request-Id à la requête, et puis le contrôle est transmis à la fonction de gestionnaire suivante. Dans la fonction de traitement de routage, nous pouvons obtenir la valeur de cet en-tête de requête grâce à la méthode c.GetHeader.
  1. 3. Utilisation du middleware dans le framework Gin
Dans le framework Gin, l'utilisation du middleware est très simple. Transmettez simplement les fonctions middleware à Use, GET, POST, PUT, DELETE code> et d’autres méthodes peuvent être utilisées. Par exemple :

r := gin.Default()
r.Use(cors.Default())

Dans le code ci-dessus, nous utilisons un middleware global MyGlobalMiddleware(), qui agira sur toutes les routes. Nous utilisons également un middleware local AddHeader(), qui n'agit qu'avant la route /v1/hello. Dans la fonction Hello, nous obtenons la valeur de l'en-tête de requête X-Request-Id et la renvoyons à l'appelant.

Grâce à la démonstration de ce code, nous pouvons voir la méthode simple et pratique d'utilisation du middleware dans le framework Gin.

4. Middleware commun
  1. En plus du middleware personnalisé ci-dessus, le framework Gin fournit également de nombreux middleware courants. Présentons brièvement certains des middlewares les plus importants :

Middleware Logger

Le middleware Logger est le middleware responsable de. sortie des journaux d'accès Lorsque la demande est à moitié traitée, ce middleware génère un journal enregistrant les informations de la demande, telles que l'URL demandée, la méthode de demande, l'en-tête de la demande, etc.

Dans le framework Gin, le middleware Logger peut être introduit en utilisant le code suivant :
    rrreee
  1. En introduisant le middleware Logger, nous pouvons voir les informations détaillées de chaque requête dans le journal d'accès.

Middleware de récupération

Le middleware de récupération est un middleware de gestion des erreurs Lorsqu'une exception se produit dans le programme, ce middleware restaurera le fonctionnement normal du programme et affichera un message d'erreur.

Dans le framework Gin, le middleware de récupération peut être introduit à l'aide du code suivant :

rrreee

Après avoir introduit ce middleware, si une exception se produit dans le programme, il ne plantera pas directement, mais reprendra son fonctionnement normal et affichera un message d'erreur. , ce qui est pratique. Nous localisons rapidement les points problématiques.

Middleware Cors

Le middleware Cors est utilisé pour gérer les requêtes inter-domaines. Lorsque nous devons envoyer une requête à une API sous un nom de domaine différent, elle doit être vérifiée par CORS, sinon la requête sera rejetée. 🎜🎜Dans le framework Gin, le middleware Cors peut être introduit en utilisant le code suivant : 🎜rrreee🎜Après avoir introduit ce middleware, nous pouvons envoyer des requêtes à des API sous différents noms de domaine sans nous soucier de l'échec de la vérification CORS. 🎜🎜5. Résumé🎜🎜Cet article présente principalement le mécanisme middleware du framework Gin et son application dans le développement réel, le middleware joue un rôle très important. Grâce à une compréhension approfondie du mécanisme middleware, nous pouvons mieux utiliser ses fonctions et améliorer l'efficacité de notre développement et la maintenabilité des programmes. 🎜🎜En introduisant un middleware commun, nous pouvons également donner au programme plus de fonctions, telles que la sortie de journaux, la gestion des erreurs, les requêtes inter-domaines, etc., afin de mieux s'adapter aux scénarios d'application réels. 🎜🎜Par conséquent, dans le processus de développement du framework Gin, maîtriser l'utilisation du middleware est une compétence très importante. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn