我使用了一个叫" swagger"创建一个包含特定版本API规范的swagger json文件。命令如下:swagger tofile --serializeasv2 --output rest-api.json C:Service.dll v1
正如您所看到的,我必须传递swagger文档名称v1
来导出文件。名称是API的版本。是否有办法导出最新版本?
我尝试创建一个名为"最新"的swagger文档;包含最新版本的API,但我做不到。有人知道如何创建一个显示最新版本API的swagger文档吗?
v1
是Swashbuckle项目中代码示例给出的默认名称:
services.AddMvc();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
});
作为版本号,它在此之外没有特别的意义——它只是代码作者选择的称呼。"最新版本"是代码当前指定的任何内容。多次使用不同的名称调用c.SwaggerDoc
将暴露不同的Swagger文档,您可以选择让它们的名称表示一个版本-这取决于项目的Swashbuckle配置。
感谢大家的帮助。我已经找到一个解决办法了。
主要目的是避免在出现新版本API时更改控制台命令。我说的是最后一部分v1
。如果出现v2 doc,我必须将其传递给命令。
现在我可以将latest
值传递给命令并获得rest-api。
swagger tofile --serializeasv2 --output rest-api.json C:Service.dll latest
我做了什么:
在我的项目中,我为实现ISwaggerProvider
的服务实现了一个装饰器
public class SwaggerGeneratorDecorator: ISwaggerProvider
{
private readonly ISwaggerProvider _decorated;
private readonly IApiDescriptionGroupCollectionProvider _provider;
public SwaggerGeneratorDecorator(ISwaggerProvider decorated, IApiDescriptionGroupCollectionProvider provider)
{
_decorated = decorated;
_provider = provider;
}
public OpenApiDocument GetSwagger(string documentName, string host = null, string basePath = null)
{
if (documentName == "latest")
{
var group = _provider.ApiDescriptionGroups.Items.MaxBy(group => group.GroupName);
documentName = group?.GroupName ?? documentName;
}
return _decorated.GetSwagger(documentName, host, basePath);
}
}
然后在service collection中注册。
services.Decorate<ISwaggerProvider, SwaggerGeneratorDecorator>();
现在,当我运行带有'latest'参数的命令时,我得到了最新API版本的生成文件。