告诉 swaggerui 主机在哪里的最佳方式
best way to tell swaggerui where the host is
当我构建 swagger.json 文件时,我不知道要使用哪个主机。但是,我可以在承载 swaggerui 的页面加载时解决这个问题(事实上,我可能想为用户提供一个选择)。我希望在 swaggerUI 对象的配置中看到一个 options.host - 我没有看到一个。是否有我找不到的现有方法,或者我是否只需要破解代码并添加此功能(欢迎指出最好的地方)
Swagger 有一个内置的 json 主机配置定义,或者可以接受多个输入。
{
"swagger": "2.0",
"info": {
"title": "Why API",
"description": "Don't make that mistake again",
"version": "0.0.1"
},
"host": "127.0.0.1:3000",
"schemes": [
"https"
]
}
或者
"host": "test.mydomain.com:3000",
"schemes": [
"https"
],
或者您可以通过定义 var 并调用主机名或机器名或其他环境变量来拥有动态主机。
动态示例
if (typeof this.host === 'undefined' || this.host === '') {
this.host = location.host;
}
if (location.port) {
this.host = this.host + ':' + location.port;
}
两种方式
修改 swagger.js 使其接受主机选项。 swagger-UI 将选项传递给 swagger-js 以便工作。我用这个修复程序向 swagger-js 提交了一个 pull
第二个选择是 swagger-UI 接受一个 'spec' 参数。这意味着托管页面可以加载 swagger.json 文件,JSON.parse 它,在其中设置 'host',然后传递给 swaggerUi 构造函数。这对调用者来说更难,但不需要将代码更改为 swagger
这是我所做的,因为加载的文档只是一个 JSON 对象:
var swaggerDoc = require('./api/swagger.json');
if (process.env.NODE_ENV === 'development') {
swaggerDoc.host="localhost:" + process.env.PORT
}
// Initialize the Swagger middleware
swaggerTools.initializeMiddleware(swaggerDoc, function (middleware) {
// Other initialization
}
这样你就不会用开发环境配置污染你的 API 规范。
这就是我使用 Java 客户端执行此操作的方法:
DefaultApi api = new DefaultApi();
api.getApiClient().setBasePath("http://localhost:8080");
//call the API
在 Swagger 的最新版本中 UI 可以这样做,例如在 onComplete:
window.swaggerUi.api.setHost("your.host:4242");
如果您将其托管在同一应用服务器上,只需从 json 中删除主机密钥并在密钥 "basePath" 中提供相对路径。作为 -
"basePath": "/rest/createcampaign".
如果您使用 OpenApi 3.0
Variables can have arbitrary values, or may be restricted to an enum. In any case, a default value is required, which will be used if the client does not supply a value.
在 swagger-ui 中会有默认值,但该字段是一个输入字段,因此可以在运行时对其进行自定义。
您可以通过两种方式进行操作:
- 加载 index.html 并将 https://petstore.swagger.io/v2/swagger.json 替换为您的
swagger.json
所在的 url。
您可以在同一台服务器上公开本地 swagger.json
。
当您遵循此方法时,请确保在上述步骤的末尾包含静态文件。
如果您不想将 swagger.json
公开为 API,请复制 swagger 的 dist 文件夹中的 sawgger.json
。为此,index.html 和 swagger.json 必须在同一个存储库中。它在 swagger-ui-dist. 的 dist 文件夹的 index.html
里面
const ui = SwaggerUIBundle({
spec: location.host,
url: "swagger.json",
dom_id: "#swagger-ui",
deepLinking: true,
presets: [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset],
plugins: [SwaggerUIBundle.plugins.DownloadUrl],
layout: "StandaloneLayout"
});
// End Swagger UI call region
window.ui = ui;
};
- 第二种方式,
swagger.yaml/swagger.json
中的主机参数要么设为空
"host":""
或省略主机参数。
Swagger 将服务器的主机作为托管 swagger ui 的主机。
Swagger UI express 本身正在提供以下代码段,它正在获取当前主机并使用主机发布动态
app.use('/api-docs', function(req, res, next){
swaggerDocument.host = req.get('host');
req.swaggerDoc = swaggerDocument;
next();
}, swaggerUi.serve, swaggerUi.setup());
当我构建 swagger.json 文件时,我不知道要使用哪个主机。但是,我可以在承载 swaggerui 的页面加载时解决这个问题(事实上,我可能想为用户提供一个选择)。我希望在 swaggerUI 对象的配置中看到一个 options.host - 我没有看到一个。是否有我找不到的现有方法,或者我是否只需要破解代码并添加此功能(欢迎指出最好的地方)
Swagger 有一个内置的 json 主机配置定义,或者可以接受多个输入。
{
"swagger": "2.0",
"info": {
"title": "Why API",
"description": "Don't make that mistake again",
"version": "0.0.1"
},
"host": "127.0.0.1:3000",
"schemes": [
"https"
]
}
或者
"host": "test.mydomain.com:3000",
"schemes": [
"https"
],
或者您可以通过定义 var 并调用主机名或机器名或其他环境变量来拥有动态主机。
动态示例
if (typeof this.host === 'undefined' || this.host === '') {
this.host = location.host;
}
if (location.port) {
this.host = this.host + ':' + location.port;
}
两种方式
修改 swagger.js 使其接受主机选项。 swagger-UI 将选项传递给 swagger-js 以便工作。我用这个修复程序向 swagger-js 提交了一个 pull
第二个选择是 swagger-UI 接受一个 'spec' 参数。这意味着托管页面可以加载 swagger.json 文件,JSON.parse 它,在其中设置 'host',然后传递给 swaggerUi 构造函数。这对调用者来说更难,但不需要将代码更改为 swagger
这是我所做的,因为加载的文档只是一个 JSON 对象:
var swaggerDoc = require('./api/swagger.json');
if (process.env.NODE_ENV === 'development') {
swaggerDoc.host="localhost:" + process.env.PORT
}
// Initialize the Swagger middleware
swaggerTools.initializeMiddleware(swaggerDoc, function (middleware) {
// Other initialization
}
这样你就不会用开发环境配置污染你的 API 规范。
这就是我使用 Java 客户端执行此操作的方法:
DefaultApi api = new DefaultApi();
api.getApiClient().setBasePath("http://localhost:8080");
//call the API
在 Swagger 的最新版本中 UI 可以这样做,例如在 onComplete:
window.swaggerUi.api.setHost("your.host:4242");
如果您将其托管在同一应用服务器上,只需从 json 中删除主机密钥并在密钥 "basePath" 中提供相对路径。作为 - "basePath": "/rest/createcampaign".
如果您使用 OpenApi 3.0
Variables can have arbitrary values, or may be restricted to an enum. In any case, a default value is required, which will be used if the client does not supply a value.
在 swagger-ui 中会有默认值,但该字段是一个输入字段,因此可以在运行时对其进行自定义。
您可以通过两种方式进行操作:
- 加载 index.html 并将 https://petstore.swagger.io/v2/swagger.json 替换为您的
swagger.json
所在的 url。
您可以在同一台服务器上公开本地swagger.json
。
当您遵循此方法时,请确保在上述步骤的末尾包含静态文件。
如果您不想将swagger.json
公开为 API,请复制 swagger 的 dist 文件夹中的sawgger.json
。为此,index.html 和 swagger.json 必须在同一个存储库中。它在 swagger-ui-dist. 的 dist 文件夹的
index.html
里面
const ui = SwaggerUIBundle({
spec: location.host,
url: "swagger.json",
dom_id: "#swagger-ui",
deepLinking: true,
presets: [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset],
plugins: [SwaggerUIBundle.plugins.DownloadUrl],
layout: "StandaloneLayout"
});
// End Swagger UI call region
window.ui = ui;
};
- 第二种方式,
swagger.yaml/swagger.json
中的主机参数要么设为空
"host":""
或省略主机参数。
Swagger 将服务器的主机作为托管 swagger ui 的主机。
Swagger UI express 本身正在提供以下代码段,它正在获取当前主机并使用主机发布动态
app.use('/api-docs', function(req, res, next){
swaggerDocument.host = req.get('host');
req.swaggerDoc = swaggerDocument;
next();
}, swaggerUi.serve, swaggerUi.setup());