【问题标题】:How to get at openapi server values如何获取 openapi 服务器值
【发布时间】:2020-06-25 12:45:43
【问题描述】:

我的服务器有以下 yaml openapi 3 config':

servers:
  - url: "localhost"
    description: "localhost development server"
    variables:
        port:
            default: ":10000"

没有那个讨厌的破折号,通过viper 获得这些值是微不足道的,但我正在努力解决它(这是使yaml openapi 3 兼容所必需的。

这样做:

servers := viper.Get("servers")
fmt.Println(reflect.TypeOf(servers))
fmt.Println(servers)

告诉我这个:

[]interface {}
[map[description:localhost development server url:localhost variables:map[port:map[default::10000]]]]

但是我的 n00bie golang 能力缺乏忍者技能来检索 port:10000 值。

非常感谢任何帮助!

【问题讨论】:

  • 与问题无关——应该是url: "localhost{port}",即变量需要实际包含在url中。
  • @Helen - 啊,是的,我想我昨天删除了它,因为在没有增加复杂性的情况下,我在获取值时遇到了很多问题!如果我能让上面的所有东西都正常工作,我会把它加回来,马上:)
  • 仅供参考 - 我(目前)已放弃尝试支持 openapi 3 并已从 yaml 中删除破折号。这意味着我不得不介绍关于多个参数的讨厌的 hack,但是,嘿,我有一些东西可以用于我正在研究的概念证明。换句话说,我稍后会重新讨论这个;)

标签: go yaml openapi viper-go


【解决方案1】:

servers 是一个数组。假设 Viper 无法处理数组,您首先必须索引 servers 以获取其中的对象:

server:=servers[0]

一旦你有了服务器,假设它是map[string]interface{},你可以下降:

if v, ok:=server["variables"]; ok {
   if varMap, ok:=v.(map[string]interface{}); ok {
      if p, ok:=varMap["port"]; ok {
        if port, ok:=p.(map[string]interface{}); ok {
           if d, ok:=port["default"]; ok {
               defaultValue=fmt.Sprint(d)
           } 
        }
      }
   }
}

【讨论】:

  • 我已经尝试过类似的方法,但它在第一关就失败了:server:=servers[0],给出了错误Invalid operation: servers[0] (type interface {} does not support indexing)
猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-29
  • 2010-12-08
相关资源
最近更新 更多