dev-resources.site
for different kinds of informations.
Versioning in Go Huma
Published at
1/10/2025
Categories
go
documentation
Author
Philip Perry
We want to have a separate documentation for each version in Go Huma, e.g. /v1/docs, /v2/docs, etc.
This can be done by setting the docs path like this:
config.DocsPath = "/{version}/docs"
We can use middleware to get the version from the path in the request and load the description used in the docs depending on the version:
config := huma.DefaultConfig("API V"+versionNumberString, versionNumberString+".0.0")
overviewFilePath := filepath.Join("/app/docs", fmt.Sprintf("v%s", versionNumberString), "overview.md")
overview, err := ioutil.ReadFile(overviewFilePath)
if err != nil {
log.Fatalf("Error reading file: %v", err)
}
config.Info.Description = string(overview)
And we can import all routes that we want to display in the docs based on the version. This will also load them so that they can be used as actual endpoints.
This is the complete code for routing:
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"}
if helpers.Contains(versions, urlPathParts[1]) {
versionPath := urlPathParts[1]
if versionPath == "" {
http.Error(w, "version does not exist", http.StatusInternalServerError)
}
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)
overview, err := ioutil.ReadFile(overviewFilePath)
if err != nil {
log.Fatalf("Error reading file: %v", err)
}
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)
default:
api = v3handlers.AddV3Middleware(api)
router = v3handlers.AddV3ErrorResponses(router)
v3handlers.AddV3Routes(api)
}
}
next.ServeHTTP(w, r)
})
})
config := huma.DefaultConfig("API V3", "3.0.0")
config.DocsPath = "/{version}/docs"
humachi.New(router, config)
Articles
12 articles in total
Versioning in Go Huma
currently reading
Adding filter query parameters in Go Huma
read article
Why we chose the Go Huma framework to develop our API endpoints
read article
Follow me on my journey learning Go
read article
Fitting a square peg into a round hole - a painful lesson
read article
Integrating SSO with Laravel Auth Provider
read article
Scribe not extracting docblocks
read article
Evaluating Nuxt as a Laravel Fullstack developer
read article
Using Laravel Policy with middleware to protect routes
read article
Why use git worktree?
read article
Practical git cherry pick example
read article
Top 10 most used libraries and a surprising find
read article
Featured ones: