为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕尼黑8549860 2022-04-26 15:50:48
我有一个用 Go 编写的服务,它也使用 go 模板作为前端。该服务被我们的外部第三方用作查找资料和搜索的门户。还有另一个服务是用于处理订单的休息 API。门户服务有一个页面,您可以在其中查找 API 文档。我只有一个 API 版本,我使用 SwaggerUI 来显示 API 文档。我必须创建一个新端点并使其成为新 API 版本的一部分。现在我想展示一个新的 API 版本,以及支持旧客户端的旧版本。像这样的东西: 所以当用户点击门户网站上的按钮查看文档时,请求由门户中的这个函数处理(注意:我已经重构了这个函数以支持多个 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",    })}这是为什么?有没有办法让第一个版本的代码工作?我需要链接是动态的,最好在处理程序中生成。谢谢!
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

似乎有两个错误:


第一的:


  urls: {{ .jsonURLs }},

这不会jsonURLs为您以 JSON 格式编写。它会简单地写一个字符串表示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"`

}


查看完整回答
反对 回复 2022-04-26
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号