为 Go Huma 的每个版本生成独立文档,例如 /v1/docs、/v2/docs 等,可以通过配置文档路径实现。
配置文档路径:
config.docspath = "/{version}/docs"
登录后复制
版本化文档加载:
使用中间件从请求路径中提取版本信息,并根据版本加载对应的文档描述:
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)
登录后复制
根据版本导入相应的路由,实现版本化的API文档和端点。
完整路由代码:
以下代码展示了如何根据请求路径中的版本号,加载不同版本的路由和文档描述:
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: // case 3 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)
登录后复制
这段代码通过中间件处理请求,根据URL路径选择对应的版本,加载相应的配置、文档和路由。 注意错误处理和版本号的有效性检查。 helpers.Contns 函数需要自行实现,用于检查版本号是否存在于 versions 切片中。
以上就是Go Huma 中的版本控制的详细内容,更多请关注php中文网其它相关文章!