Closed
Description
Hi
I want to use /v1/orders
or /v2/orders
pattern using api versioning
Well, I configured like:
var builder = WebApplication.CreateBuilder(args);
ApiVersion apiV1 = new ApiVersion(1);
ApiVersion apiV2 = new ApiVersion(2);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddApiVersioning(opts =>
{
opts.ReportApiVersions = true;
opts.ApiVersionReader = new UrlSegmentApiVersionReader();
}).AddApiExplorer(opts =>
{
opts.GroupNameFormat = "'v'VVV";
opts.SubstituteApiVersionInUrl = true;
});
builder.Services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();
builder.Services.AddSwaggerGen();
// other DI calls
var app = builder.Build();
var orderApiSet = app.NewApiVersionSet("Orders").Build();
app.MapGet("/orders", async ([FromServices] IOrdersRepository orderRepo) =>
{
return await orderRepo.ListAsync(...);
}).WithApiVersionSet(orderApiSet)
.HasApiVersion(apiV1);
app.MapGet("/orders", async ([FromServices] IOrdersRepositoryV2 orderRepo) =>
{
return await orderRepo.List1Async(...);
}).WithApiVersionSet(orderApiSet)
.HasApiVersion(apiV2);
app.UseSwagger();
app.UseSwaggerUI(opts =>
{
var descriptions = app.DescribeApiVersions();
foreach (var desc in descriptions)
{
var url = $"/swagger/{desc.GroupName}/swagger.json";
var name = desc.GroupName.ToUpperInvariant();
opts.SwaggerEndpoint(url, $"Orders API {name}");
}
});
await app.RunAsync();
I expected if type in url like /v1/orders
that would go to first MapGet
but I got 404 page. As well as for /v2/orders
If I type /orders
without any vX
then I got 400 that api version is not specified.
How to solve this ?
A solution would be app.MapGet("v{version:apiVersion}/orders")
but in SwaggerUI displays like:
But is not quite good because I already selected api version from top right corner dropdown, don't see the purpose of {version}
in call