Maison> développement back-end> Golang> le corps du texte

Maîtriser les intercepteurs à Golang

王林
Libérer: 2024-04-07 21:33:02
original
597 Les gens l'ont consulté

Les intercepteurs permettent d'insérer une logique personnalisée dans les applications Go sans modifier le code existant. Ils peuvent être utilisés pour l'authentification, la journalisation, la gestion des erreurs, la surveillance des performances, etc. La création d'un intercepteur nécessite l'implémentation de l'interface Handler, qui définit la méthode ServeHTTP() pour gérer les requêtes HTTP et la méthode Next() pour passer le contrôle. Des exemples pratiques montrent comment utiliser les intercepteurs de journalisation pour enregistrer les chemins d'URL de toutes les requêtes entrantes et comment chaîner plusieurs intercepteurs (tels que les intercepteurs d'authentification) pour créer une logique d'application complexe.

在 Golang 中驾驭拦截器

Maîtriser les intercepteurs dans Golang

Introduction

Les intercepteurs sont un mécanisme puissant et flexible qui nous permet d'intégrer une logique personnalisée dans les applications Golang sans avoir à modifier le code existant. Ils peuvent être utilisés à diverses fins, notamment l’authentification, la journalisation, la gestion des erreurs et la surveillance des performances.

Créer un intercepteur

Pour créer un intercepteur, nous devons implémenter l'interfaceHandler. Cette interface définit deux méthodes :Handler接口。该接口定义了两个方法:

  • ServeHTTP(ResponseWriter, *Request):处理 HTTP 请求并生成响应。
  • Next(ResponseWriter, *Request)
    • ServeHTTP(ResponseWriter, *Request): Traiter les requêtes HTTP et générer des réponses.
    • Next(ResponseWriter, *Request): passez le contrôle au prochain gestionnaire ou intercepteur.

    Ce qui suit est un exemple de création d'un intercepteur :

    package main import ( "fmt" "net/http" ) func main() { // 创建一个简单的日志拦截器 logger := func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Printf("收到请求:%s\n", r.URL.Path) next.ServeHTTP(w, r) }) } // 创建一个 HTTP 路由器并使用拦截器 mux := http.NewServeMux() mux.Handle("/", logger(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, world!") }))) // 启动 HTTP 服务器 http.ListenAndServe(":8080", mux) }
    Copier après la connexion
    Cas pratique

    Dans cet exemple, nous avons créé un simple intercepteur de journal chargé d'imprimer le chemin URL de toutes les requêtes entrantes vers la console .

    Utilisation de plusieurs intercepteurs

    Nous pouvons enchaîner plusieurs intercepteurs pour créer une logique d'application complexe. Par exemple, nous pouvons créer un intercepteur d'authentification chargé de garantir que seuls les utilisateurs authentifiés peuvent accéder à certains points de terminaison :

    // 身份验证拦截器 func auth(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 检查请求头中是否存在身份验证令牌 if r.Header.Get("Authorization") == "" { http.Error(w, "未经授权", http.StatusUnauthorized) return } next.ServeHTTP(w, r) }) }
    Copier après la connexion

    Nous pouvons ajouter cet intercepteur à notre routeur comme ceci :
    mux.Handle("/private", auth(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 私有区域的逻辑 })))
    Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!