在 Go 中循环遍历 Swagger yaml 中的每个元素
Loop through each element in Swagger yaml in Go
我正在尝试使用 Golang 遍历 Swagger 文档中的所有路径和方法,并从中获取几个字段,例如:获取每个路径和方法的 operationId 值。
下面是示例 Swagger 文档 -
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"
这个 Swagger 文档不是静态的,它会发生变化。所以我没有为此定义一个结构,因为路径和方法不会保持不变。
下面是示例代码-
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
)
func main() {
m := make(map[interface{}]interface{})
err := yaml.Unmarshal([]byte(data), &m)
if err != nil {
log.Fatalf("error: %v", err)
}
fmt.Printf("--- m:\n%v\n\n", m)
for k, v := range m {
fmt.Println(k, ":", v)
}
}
我可以像下面这样打印地图 -
paths : map[/pet:map[post:map[operationId:addPet summary:Add a new pet to the store tags:[pet]] put:map[operationId:updatePet summary:Update an existing pet tags:[pet]]] /pet/findByStatus:map[get:map[operationId:findPetsByStatus summary:Finds Pets by status tags:[pet]]]]
如何像下面这样打印每个路径和方法 -
/pet post addPet
/pet put updatePet
/pet/findByStatus get findPetsByStatus
几个选项,使用 https://github.com/getkin/kin-openapi 来解析你的 YAML。下面的示例将要求您将 YAML 转换为 JSON.
t := &openapi2.T{}
if err := t.UnmarshalJSON([]byte(jsdata)); err != nil {
panic(err)
}
for path, item := range t.Paths {
for method, op := range item.Operations() {
fmt.Printf("%s %s %s\n", path, method, op.OperationID)
}
}
或者您可以继续使用类型断言和 for 循环。
func main() {
m := make(map[string]interface{})
err := yaml.Unmarshal([]byte(data), &m)
if err != nil {
log.Fatalf("error: %v", err)
}
for k, v := range m {
if k != "paths" {
continue
}
m2, ok := v.(map[interface{}]interface{})
if !ok {
continue
}
if ok {
for path, x := range m2 {
m3, ok := x.(map[interface{}]interface{})
if !ok {
continue
}
for method, x := range m3 {
m4, ok := x.(map[interface{}]interface{})
if !ok {
continue
}
operationId, ok := m4["operationId"]
if !ok {
continue
}
fmt.Println(path, method, operationId)
}
}
}
}
}
我正在尝试使用 Golang 遍历 Swagger 文档中的所有路径和方法,并从中获取几个字段,例如:获取每个路径和方法的 operationId 值。 下面是示例 Swagger 文档 -
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"
这个 Swagger 文档不是静态的,它会发生变化。所以我没有为此定义一个结构,因为路径和方法不会保持不变。 下面是示例代码-
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
)
func main() {
m := make(map[interface{}]interface{})
err := yaml.Unmarshal([]byte(data), &m)
if err != nil {
log.Fatalf("error: %v", err)
}
fmt.Printf("--- m:\n%v\n\n", m)
for k, v := range m {
fmt.Println(k, ":", v)
}
}
我可以像下面这样打印地图 -
paths : map[/pet:map[post:map[operationId:addPet summary:Add a new pet to the store tags:[pet]] put:map[operationId:updatePet summary:Update an existing pet tags:[pet]]] /pet/findByStatus:map[get:map[operationId:findPetsByStatus summary:Finds Pets by status tags:[pet]]]]
如何像下面这样打印每个路径和方法 -
/pet post addPet
/pet put updatePet
/pet/findByStatus get findPetsByStatus
几个选项,使用 https://github.com/getkin/kin-openapi 来解析你的 YAML。下面的示例将要求您将 YAML 转换为 JSON.
t := &openapi2.T{}
if err := t.UnmarshalJSON([]byte(jsdata)); err != nil {
panic(err)
}
for path, item := range t.Paths {
for method, op := range item.Operations() {
fmt.Printf("%s %s %s\n", path, method, op.OperationID)
}
}
或者您可以继续使用类型断言和 for 循环。
func main() {
m := make(map[string]interface{})
err := yaml.Unmarshal([]byte(data), &m)
if err != nil {
log.Fatalf("error: %v", err)
}
for k, v := range m {
if k != "paths" {
continue
}
m2, ok := v.(map[interface{}]interface{})
if !ok {
continue
}
if ok {
for path, x := range m2 {
m3, ok := x.(map[interface{}]interface{})
if !ok {
continue
}
for method, x := range m3 {
m4, ok := x.(map[interface{}]interface{})
if !ok {
continue
}
operationId, ok := m4["operationId"]
if !ok {
continue
}
fmt.Println(path, method, operationId)
}
}
}
}
}