如何在OpenAPI中仅基于Host(不含端口)动态配置Server?
问题解决:Swagger UI中动态设置API服务器URL(仅保留IP,去掉端口)
核心结论
OpenAPI规范没有内置仅返回IP的{HOST}或提取端口的{PORT}变量,无法直接通过OpenAPI的Server变量实现需求。以下是几种可行的解决方案:
方案1:修改Swagger UI初始化配置(推荐)
针对Swagger UI的Standalone模式,可通过自定义JS代码动态剥离当前页面URL的端口,替换为目标API的正确地址:
在生成的Standalone页面中,找到Swagger UI初始化代码块,添加如下逻辑:
// 提取当前页面的主机IP(不含端口) const targetHost = window.location.hostname; // API基础路径 const apiBase = "/x.y.z"; // 初始化Swagger UI并修改服务器配置 window.ui = SwaggerUIBundle({ url: "openapi.json", dom_id: '#swagger-ui', presets: [ SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset ], plugins: [ SwaggerUIBundle.plugins.DownloadUrl ], onComplete: function() { // 替换Server列表为正确的API地址 window.ui.spec.servers = [{ url: `${targetHost}${apiBase}` }]; // 刷新UI生效 window.ui.updateSpec(window.ui.spec); } });
页面加载后会自动将服务器URL设置为10.0.0.10/x.y.z,避免带上Swagger服务的端口。
方案2:自定义OpenAPI变量并动态赋值
通过自定义变量实现灵活配置,同时支持动态获取IP:
- 修改
openapi.json的Server配置:
"servers": [ { "url": "{apiHost}/x.y.z", "variables": { "apiHost": { "default": "10.0.0.10", "description": "API服务器IP地址" } } } ]
- 在Swagger UI初始化时传递变量值:
window.ui = SwaggerUIBundle({ url: "openapi.json", dom_id: '#swagger-ui', presets: [ SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset ], // 动态传递当前页面的IP作为变量值 variables: { "apiHost": window.location.hostname } });
这种方式既保留了配置灵活性,也能自动适配当前环境的IP。
方案3:硬编码固定API地址(简单直接)
如果API服务器IP固定不变,直接在openapi.json中写死完整URL即可:
"servers": [ { "url": "10.0.0.10/x.y.z" } ]
无需额外配置,但缺乏动态性,适合IP长期固定的场景。
内容的提问来源于stack exchange,提问作者quickblueblur
相关产品推荐
相关产品推荐

