#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";
}
});
}