使用 SwashBuckle 为版本化 API 生成 swagger JSON 文件时删除部分 URL 路径
Removing part of the URL paths when generating swagger JSON files using SwashBuckle for versioned API's
我有一个 .NET Core Web API,其中有版本控制。目前有2个版本,2个swagger文件中的操作路径是这样的:
/api/v1/Versioning/List (v1 swagger)
/api/v2/Versioning/List (v2 swagger)
Azure DevOps 中有一个构建管道,它使用 PowerShell 生成 2 个 swagger 文件:
`dotnet swagger tofile --output pathToV1Json MyApplication.dll v1`
和
`dotnet swagger tofile --output pathToV2Json MyApplication.dll v2`
并将它们存储在工件中。在发布管道中,我使用 Create or Update Versioned API
API 管理任务来 create/update 我的 API 在 Azure API 管理中,使用那些生成的 swagger 文件。
到目前为止一切顺利,一切都按预期进行。
但是,发布步骤向 URL 添加了另一个版本部分,这是意料之中的。因此,在我在 API 管理中的最后 API 操作中,URL 看起来像这样:
.../v1/api/v1/Versioning/List (v1 swagger)
.../v2/api/v2/Versioning/List (v2 swagger)
我试图通过使用 IDocumentFilter 编辑 swagger 文件中生成的操作路径,这很有效,但它也破坏了 Swagger UI。
有什么方法可以修改这些操作路径,但仅限于生成实际的 Swagger 文件时?
所以在我的 IDocumentFilter 中,我可以有这样的东西:
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
var openApiPaths = new OpenApiPaths();
foreach (var path in swaggerDoc.Paths)
{
if ([generating actual swagger file])
{
openApiPaths.Add(path.Key.Replace("/v1", ""), path.Value);
}
else
{
openApiPaths.Add(path.Key, path.Value);
}
}
swaggerDoc.Paths = openApiPaths;
}
您可以将 IHttpContextAccessor 注入到您的 DocumentFilter 中,并检查是否确实存在可用的 HttpRequest,如下所示:
public class DocumentFilter : IDocumentFilter
{
private readonly IHttpContextAccessor _httpContextAccessor;
public DocumentFilter(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
var request = _httpContextAccessor.HttpContext?.Request;
if (request == null)
{
var copy = new OpenApiPaths();
foreach (var path in swaggerDoc.Paths)
{
var newKey = path.Key.Replace("x", "y");
copy.Add(newKey, path.Value);
}
swaggerDoc.Paths.Clear();
swaggerDoc.Paths = copy;
}
}
}
我有一个 .NET Core Web API,其中有版本控制。目前有2个版本,2个swagger文件中的操作路径是这样的:
/api/v1/Versioning/List (v1 swagger)
/api/v2/Versioning/List (v2 swagger)
Azure DevOps 中有一个构建管道,它使用 PowerShell 生成 2 个 swagger 文件:
`dotnet swagger tofile --output pathToV1Json MyApplication.dll v1`
和
`dotnet swagger tofile --output pathToV2Json MyApplication.dll v2`
并将它们存储在工件中。在发布管道中,我使用 Create or Update Versioned API
API 管理任务来 create/update 我的 API 在 Azure API 管理中,使用那些生成的 swagger 文件。
到目前为止一切顺利,一切都按预期进行。 但是,发布步骤向 URL 添加了另一个版本部分,这是意料之中的。因此,在我在 API 管理中的最后 API 操作中,URL 看起来像这样:
.../v1/api/v1/Versioning/List (v1 swagger)
.../v2/api/v2/Versioning/List (v2 swagger)
我试图通过使用 IDocumentFilter 编辑 swagger 文件中生成的操作路径,这很有效,但它也破坏了 Swagger UI。 有什么方法可以修改这些操作路径,但仅限于生成实际的 Swagger 文件时?
所以在我的 IDocumentFilter 中,我可以有这样的东西:
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
var openApiPaths = new OpenApiPaths();
foreach (var path in swaggerDoc.Paths)
{
if ([generating actual swagger file])
{
openApiPaths.Add(path.Key.Replace("/v1", ""), path.Value);
}
else
{
openApiPaths.Add(path.Key, path.Value);
}
}
swaggerDoc.Paths = openApiPaths;
}
您可以将 IHttpContextAccessor 注入到您的 DocumentFilter 中,并检查是否确实存在可用的 HttpRequest,如下所示:
public class DocumentFilter : IDocumentFilter
{
private readonly IHttpContextAccessor _httpContextAccessor;
public DocumentFilter(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
var request = _httpContextAccessor.HttpContext?.Request;
if (request == null)
{
var copy = new OpenApiPaths();
foreach (var path in swaggerDoc.Paths)
{
var newKey = path.Key.Replace("x", "y");
copy.Add(newKey, path.Value);
}
swaggerDoc.Paths.Clear();
swaggerDoc.Paths = copy;
}
}
}