Go语言遍历Swagger YAML文档提取各路径方法operationId的实现方法
Go 遍历动态Swagger提取operationId实现
你可以通过逐层对map[interface{}]interface{}做类型断言,嵌套遍历paths、路径、请求方法三层结构实现需求,完整可运行代码如下:
package main import ( "fmt" "log" "gopkg.in/yaml.v2" ) // 你的Swagger yaml内容 const data = ` swagger: "2.0" host: "petstore.swagger.io" basePath: "/v2" schemes: - "https" - "http" paths: /pet: post: tags: - "pet" summary: "Add a new pet to the store" operationId: "addPet" put: tags: - "pet" summary: "Update an existing pet" operationId: "updatePet" /pet/findByStatus: get: tags: - "pet" summary: "Finds Pets by status" operationId: "findPetsByStatus" ` func main() { m := make(map[interface{}]interface{}) err := yaml.Unmarshal([]byte(data), &m) if err != nil { log.Fatalf("解析yaml失败: %v", err) } // 取出paths层 pathsVal, ok := m["paths"] if !ok { log.Fatal("swagger文档无paths字段") } pathsMap, ok := pathsVal.(map[interface{}]interface{}) if !ok { log.Fatal("paths字段格式非法") } // 遍历所有路径 for pathKey, methodVal := range pathsMap { path, ok := pathKey.(string) if !ok { continue } // 断言当前路径下的方法集合 methodMap, ok := methodVal.(map[interface{}]interface{}) if !ok { continue } // 遍历当前路径下所有请求方法 for methodKey, opVal := range methodMap { method, ok := methodKey.(string) if !ok { continue } // 断言当前方法的详情map opMap, ok := opVal.(map[interface{}]interface{}) if !ok { continue } // 取出operationId opIdVal, ok := opMap["operationId"] if !ok { continue } opId, ok := opIdVal.(string) if !ok { continue } // 按要求格式输出 fmt.Printf("%s %s %s\n", path, method, opId) } } }
运行后输出结果完全符合要求:
/pet post addPet /pet put updatePet /pet/findByStatus get findPetsByStatus
说明
- 所有类型断言都加了合法性校验,遇到格式异常的字段会自动跳过,不会触发panic
- 无需预定义任何结构体,完全适配动态变化的Swagger路径、方法结构
- 如果需要提取其他字段(如summary、tags),直接从
opMap中取对应key的值即可
内容的提问来源于stack exchange,提问作者AnupRai
相关产品推荐
相关产品推荐

