我有一个用Go编写的服务,该服务也使用go模板作为前端。我们的外部第三方将此服务用作门户网站,用于查找和搜索内容。还有另一种服务,它是用于处理订单的rest 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",
})
}
在模板中:
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);
}
为什么?有没有办法使第一个版本的代码起作用?
我需要链接是动态的,最好是在处理程序中生成。谢谢!
似乎有两个错误:
第一:
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"`
}