【问题标题】:Removing part of the URL paths when generating swagger JSON files using SwashBuckle for versioned API's使用 SwashBuckle 为版本化 API 生成 swagger JSON 文件时删除部分 URL 路径
【发布时间】:2020-10-09 18:19:49
【问题描述】:

我有一个带有版本控制的 .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 管理任务在 Azure API 管理中创建/更新我的 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;
    }

【问题讨论】:

    标签: api .net-core azure-api-management swashbuckle.aspnetcore aspnet-api-versioning


    【解决方案1】:

    您可以将 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;
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多