Maison > développement back-end > Golang > Gestion des versions dans Go Huma

Gestion des versions dans Go Huma

Susan Sarandon
Libérer: 2025-01-11 11:44:42
original
865 Les gens l'ont consulté

Versioning in Go Huma

Ce guide détaille la mise en œuvre de la documentation versionnée dans une API Go Huma. Nous créerons une documentation distincte pour chaque version de l'API (par exemple, /v1/docs, /v2/docs).

L'approche principale consiste à configurer le chemin de documentation et à utiliser un middleware pour charger dynamiquement le contenu de la documentation spécifique à la version.

Configuration :

Le DocsPath dans la configuration Huma dicte la structure de l'URL de la documentation. Nous l'avons défini sur /{version}/docs pour s'adapter aux préfixes de version :

<code class="language-go">config.DocsPath = "/{version}/docs"</code>
Copier après la connexion

Middleware pour la gestion des versions :

Le middleware intercepte les requêtes pour déterminer la version de l'API à partir du chemin URL et charge la documentation correspondante. Cet exemple utilise un chi routeur :

<code class="language-go">router := chi.NewMux()
router.Use(func(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        urlPathParts := strings.Split(r.URL.Path, "/")
        versions := []string{"v1", "v2", "v3"} // Supported versions

        if helpers.Contains(versions, urlPathParts[1]) { // Check if a valid version is present
            versionPath := urlPathParts[1]
            versionNumberString := strings.TrimPrefix(versionPath, "v")
            versionNumber, _ := strconv.Atoi(versionNumberString)

            config := huma.DefaultConfig("API V"+versionNumberString, versionNumberString+".0.0")
            overviewFilePath := fmt.Sprintf("docs/v%s/overview.md", versionNumberString) // Path to version-specific overview

            overview, err := ioutil.ReadFile(overviewFilePath)
            if err != nil {
                http.Error(w, fmt.Sprintf("Error reading documentation: %v", err), http.StatusInternalServerError) //Improved error handling
                return
            }

            config.Info.Description = string(overview)
            api := humachi.New(router, config)

            switch versionNumber {
            case 1:
                api = v1handlers.AddV1Middleware(api)
                v1handlers.AddV1Routes(api)
            case 2:
                api = v2handlers.AddV2Middleware(api)
                v2handlers.AddV2Routes(api)
            case 3: //Explicitly handle version 3
                api = v3handlers.AddV3Middleware(api)
                router = v3handlers.AddV3ErrorResponses(router) //Handle error responses separately if needed
                v3handlers.AddV3Routes(api)
            default:
                http.Error(w, "Unsupported API version", http.StatusBadRequest) //Handle unsupported versions
                return
            }
        }

        next.ServeHTTP(w, r)
    })
})

//Final Huma config (for default/fallback behavior if no version is specified)
config := huma.DefaultConfig("API V3", "3.0.0")
config.DocsPath = "/{version}/docs"
humachi.New(router, config)</code>
Copier après la connexion

Ce middleware extrait la version, lit le fichier overview.md correspondant (ajustez le chemin si nécessaire), définit la description dans la configuration Huma, puis enregistre les gestionnaires appropriés pour cette version. La gestion des erreurs est améliorée pour fournir des réponses plus informatives. Notez la gestion explicite de la version 3 et un cas par défaut pour les versions non prises en charge. N'oubliez pas de remplacer les espaces réservés tels que v1handlers, v2handlers, v3handlers et helpers.Contains par vos implémentations réelles. La fonction helpers.Contains doit vérifier si une chaîne existe dans une tranche de chaînes.

Cette configuration garantit que la documentation correcte est fournie en fonction de la version de l'API demandée. Pensez à créer les docs/v{version}/overview.md fichiers pour chaque version.

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!

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 articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal