如何检索我的 api 的所有已实施版本的列表?
How to retrieve list of all implemented versions of my api?
我在我的 WebApi 项目中使用 aspnet-api-versioning,它工作正常。版本不是硬编码的,它们是从命名空间中检索的。
现在我想检索已实施版本的列表。我想创建一些端点(我们称之为 GetApiVersions),用户可以调用它来检索现有 api 版本号的简单集合,例如[1, 2, 3].
在负责根据检索到的请求(CurrentImplementationApiVersionSelector
、SelectVersion
方法)选择正确 api 版本的代码中,有一个 ApiVersionModel
参数带有ImplementedApiVersions
属性。
ImplementedApiVersions
属性 似乎正是我所需要的,但我不知道如何在我的 GetApiVersions 端点内访问它。有没有办法找回它?或者是否有任何其他方法以编程方式检索已实施的 api 版本列表?
@Marta 你的目标是什么?有了 API 版本后,您希望用它们做什么?这将决定解决方案。
如果您只想在请求中报告此信息,这就是 built-in;你只需要打开它。
options.ReportApiVersions = true;
这将 return api-supported-versions 和 api-deprecated-versions headers。您可以在 Version Discovery wiki 主题中查看此内容和更多信息。
您还可以对控制器中当前正在执行的操作使用 GetApiVersionModel 扩展方法。同样 - 根据您在管道中的时间和位置确定您检索信息的方式。
对于文档类型的场景,您还需要 API Versioning API Explorer 包。这将为 Web API 提供 IApiExplorer 实现,它将按 API 版本整理所有 APIs 和路由。您可以根据需要重新排序。这与 Swagger/OpenAPI 生成器用来构建文档的 approach/technique 相同。您可以通过以下方式将其集成到您的应用程序中:
var apiExplorer = configuration.AddVersionedApiExplorer(options => { });
// TODO: use the API Explorer
具体如何使用 API 资源管理器由您决定。请注意 built-in IApiExplorer 接口不支持 grouping 的概念。如果你纯粹依赖界面,你会得到一个扁平化的列表。这取决于您引用 API Explorer 实现的位置。如果稍后在您的应用程序中请求 API 资源管理器,您要么必须在原始 IApiExplorer 界面的范围内工作,要么转换为 VersionedApiExplorer。 AddVersionedApiExplorer
扩展方法总是 return 是一个 VersionedApiExplorer。您还可以强制创建 and/or 扩展 VersionedApiExplorer 而不是使用提供的扩展或 configuration.Services.GetApiExplorer()
.
您可以查看集成示例 here. However, if you really want to see how it's used and you're not familiar with IApiExplorer, then you probably want to look at a repo such as Swashbuckle。
希望对您有所帮助。欢迎提出更多问题。
我无法访问 ImplementedApiVersions
属性。我不得不想出一个解决方法。我创建了一个带有静态字段 (List<string> ApiVersions
) 的服务(称为 ApiVersionService)。服务允许注册和读取注册版本。当我使用 swagger 时,我在 SwaggerConfig.cs
文件中注册了所有版本:
configuration.EnableSwagger(ApiDocConfiguration.RouteTemplate, swagger =>
{
swagger.MultipleApiVersions(
(apiDescription, version) => apiDescription.GetGroupName() == version,
info =>
{
foreach (var group in apiExplorer.ApiDescriptions)
{
apiVersionService.AddApiVersion(group.Name);
// some other code
}
});
});
简单端点允许我检索所有版本:
[HttpGet]
[Route("versions")]
public IHttpActionResult GetVersions()
{
// apiVersionService returns the data stored in ApiVersions field
var versions = apiVersionService.GetApiVersions();
return Ok(versions);
}
我在我的 WebApi 项目中使用 aspnet-api-versioning,它工作正常。版本不是硬编码的,它们是从命名空间中检索的。
现在我想检索已实施版本的列表。我想创建一些端点(我们称之为 GetApiVersions),用户可以调用它来检索现有 api 版本号的简单集合,例如[1, 2, 3].
在负责根据检索到的请求(CurrentImplementationApiVersionSelector
、SelectVersion
方法)选择正确 api 版本的代码中,有一个 ApiVersionModel
参数带有ImplementedApiVersions
属性。
ImplementedApiVersions
属性 似乎正是我所需要的,但我不知道如何在我的 GetApiVersions 端点内访问它。有没有办法找回它?或者是否有任何其他方法以编程方式检索已实施的 api 版本列表?
@Marta 你的目标是什么?有了 API 版本后,您希望用它们做什么?这将决定解决方案。
如果您只想在请求中报告此信息,这就是 built-in;你只需要打开它。
options.ReportApiVersions = true;
这将 return api-supported-versions 和 api-deprecated-versions headers。您可以在 Version Discovery wiki 主题中查看此内容和更多信息。
您还可以对控制器中当前正在执行的操作使用 GetApiVersionModel 扩展方法。同样 - 根据您在管道中的时间和位置确定您检索信息的方式。
对于文档类型的场景,您还需要 API Versioning API Explorer 包。这将为 Web API 提供 IApiExplorer 实现,它将按 API 版本整理所有 APIs 和路由。您可以根据需要重新排序。这与 Swagger/OpenAPI 生成器用来构建文档的 approach/technique 相同。您可以通过以下方式将其集成到您的应用程序中:
var apiExplorer = configuration.AddVersionedApiExplorer(options => { });
// TODO: use the API Explorer
具体如何使用 API 资源管理器由您决定。请注意 built-in IApiExplorer 接口不支持 grouping 的概念。如果你纯粹依赖界面,你会得到一个扁平化的列表。这取决于您引用 API Explorer 实现的位置。如果稍后在您的应用程序中请求 API 资源管理器,您要么必须在原始 IApiExplorer 界面的范围内工作,要么转换为 VersionedApiExplorer。 AddVersionedApiExplorer
扩展方法总是 return 是一个 VersionedApiExplorer。您还可以强制创建 and/or 扩展 VersionedApiExplorer 而不是使用提供的扩展或 configuration.Services.GetApiExplorer()
.
您可以查看集成示例 here. However, if you really want to see how it's used and you're not familiar with IApiExplorer, then you probably want to look at a repo such as Swashbuckle。
希望对您有所帮助。欢迎提出更多问题。
我无法访问 ImplementedApiVersions
属性。我不得不想出一个解决方法。我创建了一个带有静态字段 (List<string> ApiVersions
) 的服务(称为 ApiVersionService)。服务允许注册和读取注册版本。当我使用 swagger 时,我在 SwaggerConfig.cs
文件中注册了所有版本:
configuration.EnableSwagger(ApiDocConfiguration.RouteTemplate, swagger =>
{
swagger.MultipleApiVersions(
(apiDescription, version) => apiDescription.GetGroupName() == version,
info =>
{
foreach (var group in apiExplorer.ApiDescriptions)
{
apiVersionService.AddApiVersion(group.Name);
// some other code
}
});
});
简单端点允许我检索所有版本:
[HttpGet]
[Route("versions")]
public IHttpActionResult GetVersions()
{
// apiVersionService returns the data stored in ApiVersions field
var versions = apiVersionService.GetApiVersions();
return Ok(versions);
}