当提供用于支持多个API规范的预生成链接时,Swagger UI不会加载这些规范

问题描述 投票:0回答:1

我有一个用Go编写的服务,该服务也使用go模板作为前端。我们的外部第三方将此服务用作门户网站,用于查找和搜索内容。还有另一种服务,它是用于处理订单的rest API。门户服务有一个页面,您可以在其中查找API文档。我只有一个API版本,并且使用SwaggerUI来显示API文档。我必须创建一个新的终结点,并将其作为新API版本的一部分。现在,我想展示一个新的API版本,但也要展示一个用于支持旧客户端的旧版本。像这样:enter image description here

因此,当用户单击门户网站上的按钮以查看文档时,请求由门户中的此功能处理(注意:我已经重构了此功能以支持多个URL):

func getDocs(c echo.Context) error {
    source := c.Get(auth.SourceName).(string)
    key := c.Get(auth.KeyName).(string)

    jsonURLs := []DocsURL{
        {
            url:         fmt.Sprintf("%s/0.1/docs?source=%s", config.baseURL, key),
            name:        "0.1"
        },
        {
            url:         fmt.Sprintf("%s/1.0/docs?source=%s", config.baseURL, key),
            name:        "0.1"
        },
    }

    return c.Render(http.StatusOK, "docs/index", map[string]interface{}{
        "source":   source,
        "key":      key,
        "pageType": "docs",
        "jsonURLs": jsonURLs,
    })
}

这是我使用SwaggerUI的模板中的脚本:

  window.onload = function() {
    const ui = SwaggerUIBundle({
      urls: {{ .jsonURLs }},
      dom_id: '#swagger-ui',
      deepLinking: true,
      presets: [
        SwaggerUIBundle.presets.apis,
        SwaggerUIStandalonePreset
      ],
      plugins: [
        SwaggerUIBundle.plugins.DownloadUrl
      ],
      layout: "StandaloneLayout",
      supportedSubmitMethods: []
    })
    window.ui = ui
    $('.tryitout').prop('disabled', true);
  }

我需要根据环境(生产,暂存,本地)生成链接。在后端生成数据并将其提供给模板进行显示也是有意义的。但这不起作用!

但是,如果我在SwaggerUIBundle中对链接进行硬编码,它将起作用,并且门户网站显示正确的下拉菜单,并允许在版本之间进行切换并为相应版本加载文档。

func getDocs(c echo.Context) error {
    source := c.Get(auth.SourceName).(string)
    key := c.Get(auth.KeyName).(string)

    return c.Render(http.StatusOK, "docs/index", map[string]interface{}{
        "source":   source,
        "key":      key,
        "pageType": "docs",
    })
}

在模板中:

window.onload = function() {
    const ui = SwaggerUIBundle({
      urls: [
        {
          url: "http://localhost:8088/0.1/docs?source=111111",
          name: "0.1"
        },
        {
          url: "http://localhost:8088/1.0/docs?source=111111",
          name: "1.0"
        }
      ],
      dom_id: '#swagger-ui',
      deepLinking: true,
      presets: [
        SwaggerUIBundle.presets.apis,
        SwaggerUIStandalonePreset
      ],
      plugins: [
        SwaggerUIBundle.plugins.DownloadUrl
      ],
      layout: "StandaloneLayout",
      supportedSubmitMethods: []
    })
    window.ui = ui
    $('.tryitout').prop('disabled', true);
  }

为什么?有没有办法使第一个版本的代码起作用?

我需要链接是动态的,最好是在处理程序中生成。谢谢!

api go swagger-ui go-templates api-doc
1个回答
0
投票

似乎有两个错误:

第一:

  urls: {{ .jsonURLs }},

这不会为您编写JSON格式的jsonURLs。它将仅编写jsonURLs的字符串表示形式。您需要编写模板来迭代jsonURLs的元素并一一打印出来,或者将jsonURLs编组为json自己:

jsonText,_:=json.Marshal(jsonURLs)
return c.Render(http.StatusOK, "docs/index", map[string]interface{}{
        "source":   source,
        "key":      key,
        "pageType": "docs",
        "jsonURLs": string(jsonText),
    })

第二:似乎您没有导出DocsURL结构的成员字段。将字段名称大写并添加json标签。

type DocsURL struct {
  URL string `json:"url"`
  Name string `json:"name"`
}
© www.soinside.com 2019 - 2024. All rights reserved.