Table des matières
Contenu de la question
Solution de contournement
et
Emballage
Maison développement back-end Golang Versionnement basé sur l'en-tête sur Golang

Versionnement basé sur l'en-tête sur Golang

Feb 10, 2024 pm 07:03 PM
overflow

golang 上基于标头的版本控制

Le contrôle de version basé sur les en-têtes sur Golang est un moyen efficace de gérer les versions de code pendant le développement. En ajoutant des informations de version au début des fichiers de code, les développeurs peuvent facilement suivre les modifications du code et l'historique des versions. Cette méthode de contrôle de version est non seulement facile à utiliser, mais également adaptée aux projets de toutes tailles. L'éditeur PHP Xigua présentera en détail l'utilisation et les précautions du contrôle de version basé sur les en-têtes sur Golang dans cet article pour aider les développeurs à mieux gérer et maintenir le code. Que vous soyez débutant ou développeur expérimenté, cet article vous fournira des références et des conseils précieux. Explorons ensemble cette technologie de contrôle de version intéressante et pratique !

Contenu de la question

Je souhaite utiliser gin pour implémenter un contrôle de version basé sur l'en-tête lors de mes déplacements. Je pense utiliser une fonction middleware pour faire cela sur le routeur.

Le client appellera la même URL d'API et la version sera dans un en-tête http personnalisé comme ceci :

Appelez la version 1 Récupérer /users/12345678 Version acceptée : v1

Appelez la version 2 : Récupérer /users/12345678 Version acceptée : v2

Ainsi, le routeur peut reconnaître l'en-tête et appeler la version spécifique. Des choses comme ça :

router := gin.Default()

            v1 := router.Group("/v1")
            v1.Use(VersionMiddleware())
            v1.GET("/user/:id", func(c *gin.Context) {
                c.String(http.StatusOK, "This is the v1 API")
            })

            v2 := router.Group("/v2")
            v2.Use(VersionMiddleware())
            v2.GET("/user/:id", func(c *gin.Context) {
                c.String(http.StatusOK, "This is the v2 API")
            })

func VersionMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        version := c.Request.Header.Get(configuration.GetConfigValue("VersionHeader"))

        // Construct the new URL path based on the version number
        path := fmt.Sprintf("/%s%s", version, c.Request.URL.Path)

        // Modify the request URL path to point to the new version-specific endpoint
        c.Request.URL.Path = path
        c.Next()
    }
}
Copier après la connexion

Solution de contournement

Veuillez vérifier l'extrait de code ci-dessous. J'utilise reverseproxy pour rediriger vers une version donnée. Vous devez vérifier soigneusement une version donnée. Sinon, cela entraînera des appels récursifs.

Remarque : j'ai utilisé deux versions de /user /user get/v1/user/v2/userget

(

et

).

Exemple de code

package main

import (
 "net/http"
 "net/http/httputil"
 "regexp"

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



func main() {
 router := gin.default()
 router.use(versionmiddleware())


 v1 := router.group("/v1")
 v1.get("/user", func(c *gin.context) {
  c.string(http.statusok, "this is the v1 api")
 })

 v2 := router.group("/v2")
 v2.get("/user", func(c *gin.context) {
  c.string(http.statusok, "this is the v2 api")
 })

 router.run(":8082")
}



func versionmiddleware() gin.handlerfunc {
    return func(c *gin.context) {
  
  // you need to check c.request.url.path whether 
  // already have a version or not, if it has a valid
  // version, return.
  regex, _ := regexp.compile("/v[0-9]+")
  ver := regex.matchstring(c.request.url.path)
  if ver {
   return
  }

  version := c.request.header.get("accept-version")
  
  // you need to validate  given version by the user here.
  // if version is not a valid version, return error 
  // mentioning that given version is invalid.

  director := func(req *http.request) {
    r := c.request
    req.url.scheme = "http"
    req.url.host = r.host
    req.url.path =  "/"+ version + r.url.path
    }
  proxy := &httputil.reverseproxy{director: director}
  proxy.servehttp(c.writer, c.request)
 }
}
Copier après la connexion

ou
  • Vous pouvez le faire en utilisant l'emballage de gin ci-dessous.
    Exemple
  • package main
    
    import (
     "net/http"
    
     "github.com/gin-gonic/gin"
     "github.com/udayangaac/stackoverflow/golang/75860989/ginwrapper"
    )
    
    
    
    func main() {
      engine := gin.default()
     router := ginwrapper.newrouter(engine)
    
     defaultrouter := router.default()
     defaultrouter.get("/profile",func(ctx *gin.context) {
    
     })
    
     v1 := router.withversion("/v1")
     v1.get("/user",func(ctx *gin.context) {
      ctx.string(http.statusok, "this is the profile v1 api")
     })
    
     v2 := router.withversion("/v2")
     v2.get("/user",func(ctx *gin.context) {
      ctx.string(http.statusok, "this is the profile v2 api")
     })
    
     
     engine.run(":8082")
    }
    
    Copier après la connexion

Emballage

    package ginwrapper
    
    import (
     "fmt"
     "net/http"
    
     "github.com/gin-gonic/gin"
    )
    
    type router struct {
     router *gin.engine
     versiongroups map[string]*gin.routergroup
    }
    
    type versionedrouter struct {
     version string
     router
    }
    
    func newrouter(router *gin.engine) *router {
     return &router{
      router: router,
      versiongroups: make(map[string]*gin.routergroup),
     }
    }
    
    func (a *router) default() versionedrouter {
     return versionedrouter{router: *a }
    }
    
    func  (a *router) withversion(version string) versionedrouter {
     if _,ok := a.versiongroups[version]; ok {
      panic("cannot initialize same version multiple times")
     }
     a.versiongroups[version] = a.router.group(version)
     return versionedrouter{router: *a,version:version }
    }
    
    
    
    
    func (vr versionedrouter) get(relativepath string, handlers ...gin.handlerfunc)  {
     vr.handle(http.methodget,relativepath,handlers...)
    }
    
    // note: you need to follow the same for other http methods.
    // as an example, we can write a method for post http method as below,
    // 
    //  func (vr versionedrouter) post(relativepath string, handlers ...gin.handlerfunc)  {
    //   vr.handle(http.methodpost,relativepath,handlers...)
    //  }
    
    
    
    
    
    func (vr versionedrouter)handle(method,relativepath string, handlers ...gin.handlerfunc)  {
     if !vr.isrouteexist(method,relativepath) {
      vr.router.handle(method,relativepath,func(ctx *gin.context) {
       version := ctx.request.header.get("accept-version")
       if len(version) == 0 {
        ctx.string(http.statusbadrequest,"accept-version header is empty")
       }
       ctx.request.url.path = fmt.sprintf("/%s%s", version, ctx.request.url.path)
       vr.router.handlecontext(ctx)
      })
     }
    
     versionedrelativepath := vr.version + relativepath
     if !vr.isrouteexist(method,versionedrelativepath) {
      vr.router.handle(method,versionedrelativepath,handlers... )
     }
    }
    
    
    func (a versionedrouter) isrouteexist(method,relativepath string) bool {
     for _,route := range a.router.routes() {
      if route.method == method && relativepath == route.path {
       return true
      } 
     }
     return false
    }
    
    
    Copier après la connexion
  • Demande d'échantillon/v1/user
  • /v2/user
    curl --location 'localhost:8082/user' \
    --header 'accept-version: v1'
    Copier après la connexion
🎜🎜 🎜
curl --location 'localhost:8082/user' \
--header 'Accept-version: v2'
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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le prix du Bitcoin depuis sa naissance 2009-2025 Le résumé le plus complet des prix historiques du BTC Le prix du Bitcoin depuis sa naissance 2009-2025 Le résumé le plus complet des prix historiques du BTC Jan 15, 2025 pm 08:11 PM

Depuis sa création en 2009, Bitcoin est devenu un leader dans le monde des cryptomonnaies et son prix a connu d’énormes fluctuations. Pour fournir un aperçu historique complet, cet article compile les données sur les prix du Bitcoin de 2009 à 2025, couvrant les principaux événements du marché, les changements de sentiment du marché et les facteurs importants influençant les mouvements de prix.

Que faire si l'heure dans le coin inférieur droit de Windows 11 est révolue_Que faire si l'heure dans le coin inférieur droit de Windows 11 est révolue Que faire si l'heure dans le coin inférieur droit de Windows 11 est révolue_Que faire si l'heure dans le coin inférieur droit de Windows 11 est révolue May 06, 2024 pm 01:20 PM

1. Tout d’abord, faites un clic droit sur l’espace vide de la barre des tâches en bas de Windows 11 et sélectionnez [Paramètres de la barre des tâches]. 2. Recherchez [taskbarcorneroverflow] à droite dans les paramètres de la barre des tâches. 3. Recherchez ensuite [horloge] ou [Horloge] au-dessus et sélectionnez pour l'allumer. Méthode 2 : 1. Appuyez sur le raccourci clavier [win+r] pour appeler run, entrez [regedit] et appuyez sur Entrée pour confirmer. 2. Ouvrez l'éditeur de registre, recherchez-y [HKEY_CURRENT_USERControlPanel] et supprimez-le. 3. Après la suppression, redémarrez l'ordinateur et vous serez invité à effectuer la configuration. Lorsque vous reviendrez au système, l'heure s'affichera.

Existe-t-il des forums communautaires ou des groupes de discussion sur les fonctions Java où je peux poser des questions et en discuter ? Existe-t-il des forums communautaires ou des groupes de discussion sur les fonctions Java où je peux poser des questions et en discuter ? Apr 28, 2024 pm 02:12 PM

Réponse : Les forums communautaires et groupes de discussion suivants sont disponibles pour les questions de programmation fonctionnelle Java : StackOverflow : le plus grand site Web de questions et réponses sur la programmation au monde avec une communauté d'experts en programmation fonctionnelle Java. JavaFunctionalProgramming : un forum communautaire axé sur la programmation fonctionnelle Java, proposant des discussions sur les concepts, les fonctionnalités du langage et les meilleures pratiques. Redditr/FunctionalJava : un sous-reddit axé sur la programmation Java fonctionnelle, en se concentrant sur les outils, les bibliothèques et les technologies. Discord : JavaFunctional Programming : service Discord qui propose des discussions, un partage de code et une collaboration en temps réel

Comment utiliser le code d'autres personnes en python Comment utiliser le code d'autres personnes en python May 05, 2024 pm 07:54 PM

Comment utiliser le code Python d’autres personnes ? Rechercher des référentiels de code : recherchez le code dont vous avez besoin sur des plateformes telles que PyPI et GitHub. Code d'installation : utilisez pip ou clonez le référentiel GitHub pour l'installer. Importer des modules : utilisez l'instruction import dans votre script pour importer les modules installés. Travailler avec du code : accédez aux fonctions et aux classes dans les modules. (Facultatif) Adaptez le code : modifiez le code si nécessaire pour l'adapter à votre projet.

Que dois-je faire si l'heure sur mon ordinateur Win11 est toujours fausse ? Comment régler la mauvaise heure sur un ordinateur Windows 11 Que dois-je faire si l'heure sur mon ordinateur Win11 est toujours fausse ? Comment régler la mauvaise heure sur un ordinateur Windows 11 May 03, 2024 pm 09:20 PM

Que dois-je faire si l'heure sur mon ordinateur Win11 est toujours fausse ? Nous définissons tous l'heure ou le calendrier lorsque nous utilisons le système Win11, mais de nombreux utilisateurs demandent que l'heure de l'ordinateur soit toujours erronée, alors que se passe-t-il ? Les utilisateurs peuvent cliquer directement sur la barre des tâches ci-dessous, puis rechercher taskbarcorneroverflow pour la configurer. Laissez ce site présenter en détail aux utilisateurs comment ajuster l'erreur de temps sur les ordinateurs Win11. Comment régler l'erreur d'heure de l'ordinateur dans Windows 11. Méthode 1 : 1. Nous faisons d'abord un clic droit sur l'espace vide de la barre des tâches ci-dessous et sélectionnons Paramètres de la barre des tâches. Méthode 2 : 1. Appuyez sur le raccourci clavier win+r pour appeler run, entrez regedit et appuyez sur Entrée pour confirmer.

Types d'exceptions courants et leurs mesures de réparation dans le développement de fonctions Java Types d'exceptions courants et leurs mesures de réparation dans le développement de fonctions Java May 03, 2024 pm 02:09 PM

Types d'exceptions courants et leurs mesures de réparation dans le développement de fonctions Java Lors du développement de fonctions Java, diverses exceptions peuvent survenir, affectant l'exécution correcte de la fonction. Voici les types d'exceptions courants et leurs mesures de réparation : 1. NullPointerException Description : levée lors de l'accès à un objet qui n'a pas été initialisé. Correctif : assurez-vous de vérifier que l'objet n'est pas nul avant de l'utiliser. Exemple de code : try{Stringname=null;System.out.println(name.length());}catch(NullPointerExceptione){

Que signifie le débordement en CSS Que signifie le débordement en CSS Apr 28, 2024 pm 03:15 PM

overflow est une propriété CSS utilisée pour contrôler le mode d'affichage du contenu de l'élément lorsqu'il dépasse le conteneur. Les valeurs disponibles incluent : visible : le contenu est visible, le conteneur de débordement est masqué : le contenu du débordement est coupé scroll : le la barre de défilement s'affiche pour visualiser le contenu de débordement auto : le navigateur détermine automatiquement s'il faut afficher la barre de défilement hériter : hérite de l'attribut de débordement de l'élément parent

Personne ne s'occupe des comptes aléatoires de Douyin ? Puis-je faire appel une deuxième fois ? Personne ne s'occupe des comptes aléatoires de Douyin ? Puis-je faire appel une deuxième fois ? May 03, 2024 am 09:37 AM

En tant que plate-forme de vidéos courtes de renommée mondiale, Douyin dispose d'une énorme base d'utilisateurs et de créateurs de contenu. Cependant, comme les règles de la plateforme sont constamment mises à jour et améliorées, certains utilisateurs peuvent se heurter à des interdictions de compte. Cela a soulevé des questions publiques sur la transparence et l’équité de la gestion de la plateforme. Cet article abordera la question des interdictions de compte Douyin et si les utilisateurs ont des moyens de faire appel après l'interdiction de leurs comptes. Il peut y avoir de nombreuses raisons d'être banni de la plateforme Douyin, y compris, mais sans s'y limiter, le contenu illégal, la violation des réglementations de la plateforme, la violation des droits d'autrui, etc. Afin de maintenir l'ordre de la plateforme et les intérêts des utilisateurs, Douyin a mis en place une série de règles et de mécanismes de contrôle. Lorsque certains utilisateurs enfreignent les règles, leurs comptes peuvent être bannis. Cependant, certains utilisateurs peuvent s'interroger ou être insatisfaits des raisons de l'interdiction.

See all articles