Как я могу иметь выпадающий список для другой версии API в REDOC c#

#c# #asp.net #asp.net-core #swagger #redoc

#c# #asp.net #asp.net-core #развязность #redoc

Вопрос:

Вот моя конфигурация в startup.cs

         services.AddApiVersioning(options =>
        {
            options.DefaultApiVersion = new ApiVersion(1, 0);
            options.AssumeDefaultVersionWhenUnspecified = true;
            options.ApiVersionReader = new UrlSegmentApiVersionReader();
            options.ReportApiVersions = true;
        });


        // Register the Swagger services
        services.AddSwaggerDocument(config =>
        {
            config.DocumentName = "v1";
            config.ApiGroupNames = new[] { "1" };
            config.GenerateEnumMappingDescription = true;
            config.AddSecurity("bearer", Enumerable.Empty<string>(), new OpenApiSecurityScheme
            {
                Type = OpenApiSecuritySchemeType.OAuth2,
                Description = "Get access to data while protecting your account credentials. OAuth2 is also a safer and more secure way to give you access.",
                Flow = OpenApiOAuth2Flow.Implicit,
                Flows = new OpenApiOAuthFlows()
                {
                    Implicit = new OpenApiOAuthFlow()
                    {

                        Scopes = new Dictionary<string, string>
                        {
                            {Configuration.GetValue<string>("IdentityServer:ClientId"), Configuration.GetValue<string>("IdentityServer:ClientId")},
                            {Configuration.GetValue<string>("IdentityServer:BankClientId"), Configuration.GetValue<string>("IdentityServer:BankClientId")}

                        },
                        TokenUrl = Configuration.GetValue<string>("IdentityServer:Authority")   "/connect/token",
                        AuthorizationUrl = Configuration.GetValue<string>("IdentityServer:Authority")   "/connect/authorize",

                    },
                }
            });
            config.OperationProcessors.Add(new AspNetCoreOperationSecurityScopeProcessor("bearer"));
            config.PostProcess = document =>
            {
                document.Info.Version = Configuration.GetValue<String>("SwaggerDocument:Version");
                document.Info.Title = Configuration.GetValue<String>("SwaggerDocument:Title");
                document.Info.Description = Configuration.GetValue<String>("SwaggerDocument:Description");
            };
        })
        .AddSwaggerDocument(document =>
            {
                document.DocumentName = "v2";
                document.ApiGroupNames = new[] { "2" };
                document.GenerateEnumMappingDescription = true;
                document.AddSecurity("bearer", Enumerable.Empty<string>(), new OpenApiSecurityScheme
                {
                    Type = OpenApiSecuritySchemeType.OAuth2,
                    Description = "Get access to data while protecting your account credentials. OAuth2 is also a safer and more secure way to give you access.",
                    Flow = OpenApiOAuth2Flow.Implicit,
                    Flows = new OpenApiOAuthFlows()
                    {
                        Implicit = new OpenApiOAuthFlow()
                        {

                            Scopes = new Dictionary<string, string>
                        {
                            {Configuration.GetValue<string>("IdentityServer:ClientId"), Configuration.GetValue<string>("IdentityServer:ClientId")},
                            {Configuration.GetValue<string>("IdentityServer:BankClientId"), Configuration.GetValue<string>("IdentityServer:BankClientId")}

                        },
                            TokenUrl = Configuration.GetValue<string>("IdentityServer:Authority")   "/connect/token",
                            AuthorizationUrl = Configuration.GetValue<string>("IdentityServer:Authority")   "/connect/authorize",

                        },
                    }
                });
                document.OperationProcessors.Add(new AspNetCoreOperationSecurityScopeProcessor("bearer"));
                document.PostProcess = document =>
                {
                    document.Info.Version = "v2";
                    document.Info.Title = Configuration.GetValue<String>("SwaggerDocument:Title");
                    document.Info.Description = Configuration.GetValue<String>("SwaggerDocument:Description");
                };
            });

        app.UseOpenApi();
        
        //Redoc
        app.UseReDoc(options =>
        {
            options.Path = Configuration.GetValue<String>("Redoc:Path");
            options.DocumentPath = Configuration.GetValue<String>("Redoc:DocumentPath");
        });
  

Версия API отображается для swagger. Ниже приведено изображение

введите описание изображения здесь

но то же самое не происходит для REDOC. ниже приведено изображение

введите описание изображения здесь

Если я изменю URL с https://localhost:44311/redoc/index.html?url=/swagger/v1/swagger.json чтобы https://localhost:44311/redoc/index.html?url=/swagger/v2/swagger.json Просто измените v1 на v2, тогда я получу API для v2. Но я хочу, чтобы в REDOC UI был выпадающий список для выбора версии. Кто-нибудь может мне помочь?

Комментарии:

1. Выбор версии — это функция, доступная только для пользовательского интерфейса.

Ответ №1:

Это работает для меня в .net 5:

развязность -> /docs

redoc -> /docs-v1 /docs-v2 , и т.д.

  public void Configure(IApplicationBuilder app, IApiVersionDescriptionProvider provider){

        ...

        app.UseSwagger(options => { options.RouteTemplate = "docs/{documentName}/docs.json"; });
        app.UseSwaggerUI(options =>
        {
            options.RoutePrefix = "docs";
            foreach (var description in provider.ApiVersionDescriptions)
            {
                options.SwaggerEndpoint($"/docs/{description.GroupName}/docs.json", description.GroupName.ToUpperInvariant());
            }
        });

        foreach (var description in provider.ApiVersionDescriptions)
        {
            app.UseReDoc(options =>
            {
                options.DocumentTitle = $"API Documentation {description.GroupName}";
                options.SpecUrl = $"/docs/{description.GroupName}/docs.json";
                options.RoutePrefix = $"docs-{description.GroupName}";
            });
        }

}
  

Ответ №2:

У вас не может быть селектора пользовательского интерфейса, но вы определенно можете изменить поведение URL-адресов для разных версий. Это означает, что у вас могут быть разные URL-адреса для каждой версии. Когда вы настраиваете его, самый простой способ — определить URL-адреса, как показано ниже.

Пожалуйста, обратите внимание, что я предполагаю, что вы знаете об управлении версиями, чтобы это работало, и что все работает с управлением версиями Swagger. Итак, что у меня есть, так это то, что я получаю параметр IApiVersionDescriptionProvider в моем методе Configure(). И затем это позволяет мне перебирать разные версии и создавать разные ReDoc (ы).

 public void Configure(IApplicationBuilder app, IApiVersionDescriptionProvider provider){
 
 app.UseSwagger();

 // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), 
 // specifying the Swagger JSON endpoint.
 app.UseSwaggerUI(c =>
 {
     foreach (var description in provider.ApiVersionDescriptions)
      {
                c.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json",
                    $"Your API {description.GroupName.ToUpperInvariant()}");
      }
      c.OAuthUsePkce();
      c.OAuthClientId("something");
      c.OAuthAppName("Something");
 });

 //Use ReDoc
 app.UseReDoc(c =>
 {
   foreach (var description in provider.ApiVersionDescriptions)
    {
      c.DocumentTitle = $"MY API Documentation {description.GroupName.ToUpperInvariant()}";
      c.RoutePrefix = $"{documentation/{description.GroupName}";
      c.SpecUrl = $"{/swagger/{description.GroupName}/swagger.json";
    }
 });
}